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

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

1、功能介绍

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

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

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

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

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

2、代码案例

csharp 复制代码
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)}");

        }


        /// <summary>
        /// 计算保留小数
        /// 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
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        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.##");
            }
        }


    }
}

3、输出结果

4、封装扩展方法

csharp 复制代码
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.##");
        }
    }

}

5、控制台调用

csharp 复制代码
     double num = 2567.11233;
     Console.WriteLine(num.FormatNumber());

6、其他方法地址

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

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

相关推荐
y52364818 分钟前
Javascript监控元素样式变化
开发语言·javascript·ecmascript
IT技术分享社区1 小时前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
极客代码1 小时前
【Python TensorFlow】入门到精通
开发语言·人工智能·python·深度学习·tensorflow
疯一样的码农1 小时前
Python 正则表达式(RegEx)
开发语言·python·正则表达式
&岁月不待人&1 小时前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove1 小时前
G1垃圾回收器日志详解
java·开发语言
无尽的大道2 小时前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒2 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
binishuaio2 小时前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE2 小时前
【Java SE】StringBuffer
java·开发语言