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())

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

相关推荐
潜创微科技2 小时前
IT6520:USB‑C 转 MIPI 芯片方案 4K@120Hz 高清显示
c语言·开发语言
言之。3 小时前
【Python】免费的中文 AI 配音方案
开发语言·人工智能·python
天天进步20153 小时前
Python全栈项目:从零手操一个高性能 API 网关
开发语言·python
Java面试题总结3 小时前
java高频面试题(2026最新)
java·开发语言·jvm·数据库·spring·缓存
安生生申4 小时前
使用pygame实现2048
开发语言·python·pygame
魔法阵维护师5 小时前
从零开发游戏需要学习的c#模块,第十六章(安装 MonoGame 并创建第一个窗口)
学习·游戏·c#·monogame
hh.h.5 小时前
CANN算子开发入门:从零开始写第一个Ascend C算子
c语言·开发语言·cann·c算子
吴可可1235 小时前
用Teigha修改并保存CAD文件
数据库·算法·c#
AI科技星5 小时前
全域数学·第三部·数术几何部·平行网格卷 完整专著目录(含拓扑发展史+学科定位·终稿)
c语言·开发语言·网络·量子计算·agi
SunnyDays10115 小时前
Java 读写 Excel 公式:从基础到高级的实战总结
java·开发语言·excel