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

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

相关推荐
小蜗牛慢慢爬行4 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
Algorithm157614 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
shinelord明23 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
呆呆小雅29 分钟前
C#关键字volatile
java·redis·c#
Monly2130 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu30 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee202131 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
7yewh33 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux
waicsdn_haha1 小时前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
_WndProc1 小时前
C++ 日志输出
开发语言·c++·算法