• c#动态保留小数位数的数值格式化方法实例----从小数点后非零数字保留两位进行四舍五入


    c#动态保留小数位数的数值格式化方法实例----从小数点后非零数字保留两位进行四舍五入

    1、功能介绍

    1. 输入的数字是整数,则直接返回整数部分的字符串表示。

    2. 如果输入的数字是小数,则执行以下步骤:

        2.1 如果小数部分.后以".0"开头(例如:0.00013),需要动态计算显示,不允许固定保留小数位数。这意味着不能直接保留两位小数,因为无法确定后面有多少位0。直接保留会显示为0或者0.00

        2.2 如果小数部分不以".0"开头,直接进行四舍五入并保留小数位数。

    该方法的目的是根据输入的数字进行判断和处理,使得最终输出的字符串满足上述保留小数的规则。

    2、代码案例

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApp4
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                Console.WriteLine($"原始值:567--------转换后的值:{FormatNumber(567)}");
                Console.WriteLine($"原始值:0.00000196--------转换后的值:{FormatNumber(0.00000196)}");
                Console.WriteLine($"原始值:831.00002455--------转换后的值:{FormatNumber(831.00002455)}");
                Console.WriteLine($"原始值:76.008921--------转换后的值:{FormatNumber(76.008921)}");
                Console.WriteLine($"原始值:0.003333333--------转换后的值:{FormatNumber(0.003333333)}");
                Console.WriteLine($"原始值:0.54241218115613401401552902563902978171--------转换后的值:{FormatNumber(0.54241218115613401401552902563902978171)}");
    
            }
    
    
            /// 
            /// 计算保留小数
            /// 1、整数:如果是整数则直接返回
            /// 2、小数:
            ///     2.1小数点后以.0开头,需要动态计算显示,假如0.00013,直接保留两位岂不是0.00了,又不确定后面有多少位0,不允许固定保留小数位
            ///     2.2小数点后不为.0开头,直接四舍五入保存
            /// 0.00001显示为0.00001
            /// 0.00000196显示为0.000002
            /// 76.008921显示为76.0089
            /// 831.00002455显示为831.000025
            /// 0.003333333显示为0.0033
            /// 0.54241218115613401401552902563902978171显示为0.54
            /// 567显示为567
            /// 
            /// 
            /// 
            static string FormatNumber(double number)
            {
                try
                {
                    // 判断是否整数,如果是,直接返回整数部分
                    if (number == Math.Floor(number))
                    {
                        return number.ToString("0");
                    }
                    else if (number < 0)
                    {
                      //引用.NET(C#)将十进制数四舍五入保留第一个非零小数(Math.Round()),见6、其他方法地址
                        int precision = 0;
                        var val = number;
                        while (Math.Abs(val) < 1)
                        {
                            val *= 10;
                            precision++;
                            if (precision > 10) // 设置一个最大精度限制,避免无限循环
                                break;
                        }
                        return ((double)Math.Round(number, precision + 1)).ToString();
                    }
                    else
                    {
                        // 获取小数部分
                        double decimalPart = number - Math.Floor(number);
                        // 转换小数部分为字符串
                        string decimalPartString = decimalPart.ToString("0.##############################");
                        // 找到小数点的位置
                        int dotIndex = decimalPartString.IndexOf('.');
    
                        // 计算小数部分的 ".0" 开头的零的数量
                        int zeroCount = 0;
                        for (int i = dotIndex + 1; i < decimalPartString.Length; i++)
                        {
                            if (decimalPartString[i] == '0')
                            {
                                zeroCount++;
                            }
                            else
                            {
                                break;
                            }
                        }
    
                        // 生成保留小数位数的格式字符串
                        string formatString;
                        if (zeroCount == 0)
                        {
                            formatString = "0.00"; // 如果没有 ".0" 开头的零,保留两位小数
                        }
                        else
                        {
                            formatString = "0." + new string('#', 2 + zeroCount); // 否则,根据零的数量生成格式字符串
                        }
    
                        return number.ToString(formatString);
                    }
                }
                catch (Exception ex)
                {
                    return number.ToString("0.##");
                }
            }
    
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109

    3、输出结果

    在这里插入图片描述

    4、封装扩展方法

    
    public static class FormatExtension
    {
        public static string FormatNumber(this double number)
        {
            try
            {
                // 判断是否整数,如果是,直接返回整数部分
                if (number == Math.Floor(number))
                {
                    return number.ToString("0");
                }
                else
                {
                    // 获取小数部分
                    double decimalPart = number - Math.Floor(number);
                    // 转换小数部分为字符串
                    string decimalPartString = decimalPart.ToString("0.##############################");
                    // 找到小数点的位置
                    int dotIndex = decimalPartString.IndexOf('.');
    
                    // 计算小数部分的 ".0" 开头的零的数量
                    int zeroCount = 0;
                    for (int i = dotIndex + 1; i < decimalPartString.Length; i++)
                    {
                        if (decimalPartString[i] == '0')
                        {
                            zeroCount++;
                        }
                        else
                        {
                            break;
                        }
                    }
    
                    // 生成保留小数位数的格式字符串
                    string formatString;
                    if (zeroCount == 0)
                    {
                        formatString = "0.00"; // 如果没有 ".0" 开头的零,保留两位小数
                    }
                    else
                    {
                        formatString = "0." + new string('#', 2 + zeroCount); // 否则,根据零的数量生成格式字符串
                    }
    
                    return number.ToString(formatString);
                }
            }
            catch (Exception ex)
            {
                return number.ToString("0.##");
            }
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    5、控制台调用

         double num = 2567.11233;
         Console.WriteLine(num.FormatNumber());
    
    • 1
    • 2

    6、其他方法地址

    .NET(C#)将十进制数四舍五入保留第一个非零小数(Math.Round())

    如果有哪位前辈或同胞了解类似以上转换合适的方法、以及依赖包,可以说明下,一起学习进步,本次遇到记录一下~

  • 相关阅读:
    学习Java的常用开发工具
    【食品加工技术】第三章 淀粉制糖与糖果加工技术 笔记
    c++动态创建二维数组和释放
    杰理之、产线装配环节【篇】
    搭建HBase分布式集群
    如何写好一个接口
    Azure Kubernetes Service中重写规则踩坑小记录
    docker安装redis
    array 数组相关方法
    Postgresql在linux环境下以源码方式安装
  • 原文地址:https://blog.csdn.net/weixin_42064877/article/details/132834158