.net 如何在使用Console.WriteLine()显示数字时将其截断为固定大小而不进行舍入

gkl3eglg  于 2023-01-10  发布在  .NET
关注(0)|答案(5)|浏览(139)

我试图格式化一个数字在一个非常具体的方式时显示它,我已经尝试搞乱与字符串格式,但无法找到一种方法,使其工作完全符合我的需要。
例如,假设我有一个值为"123459.7889"的双精度型变量,我想将其格式设置为"459.788"(000.000),但仅在控制台写入行期间()并且不舍入或更改数字的内部值。数字的完整值将不会显示,技术上应该"溢出"字符串,因为它应该只打印小数点左边的前3个数字。
以下是一些示例输入和示例输出:
格式化为"000.000"的12345.678将变为345.678
格式化为"000.000"的1000000.678将变为000.678
格式化为"000.000"的1.777888将变为001.777
格式化为"000.000"的99999.9将变为999.900
基本上,不管数字的内部大小如何,格式化输出应该始终是小数点左边的3个数字和小数点右边的3个数字,如果有空格的话,用零替换缺失的空格。
我试着查看C#文档中的示例,发现了以下内容:

double value = 123459.7889;
string result = String.Format("{0,8:00000000} {0,8:00000000.000}", value);
Console.WriteLine(result);

但是它并不像我所需要的那样工作,当运行它的时候,数字被四舍五入,所以它变成了00123459.789而不是00123459.788,例如,如果数字增长,它就不再停留在那个固定的大小。

vpfxa7rd

vpfxa7rd1#

试试这个:

double value = 123459.7889;
Console.WriteLine((Math.Truncate(Math.Abs(value) % 1000) + double.Parse((Math.Round(Math.Abs(value), 3, MidpointRounding.ToZero) -
               Math.Truncate(Math.Abs(value))).ToString(".000"))).ToString("000.000"));

数值= 123459.7889;结果= 345.678
数值= 1000000.678;结果= 000.678
数值= 1.777888;结果= 001.777
数值= 99999.9;结果= 999.900
数值= 152;结果= 152.000
值= -100.02;结果= 100.020
数值= 10.0005;结果= 010.000

uxh89sit

uxh89sit2#

当值字符不够时,我们可以使用PadLeftPadRight来填充零。

    • 执行情况:**
static void Main(string[] args)
{
    double value = 1.12;
    string valueStr = value.ToString().Replace("-", ""); // convert to string

    // check if value does not contain decimal and add
    if (!valueStr.ToString().Contains("."))
        valueStr += valueStr + ".0"; // add decimal part

    var arr = valueStr.ToString().Split(".");

    string intValue = arr[0]; //1
    intValue = intValue.PadLeft(3,'0'); //001
    intValue = intValue.Substring(intValue.Length - 3, 3); //001

    string decimalValue = arr[1]; //12
    decimalValue = decimalValue.PadRight(3,'0'); //120
    decimalValue = decimalValue.Substring(0, 3); //120

    string result = $"{intValue}.{decimalValue}";
    Console.WriteLine(result);
}
    • 结果:**
12345.678   > 345.678
1000000.678 > 000.678
1.777888    > 001.777
99999.9     > 999.900
152         > 152.000
-100.02     > 100.020
-10.0005    > 010.000
b09cbbtk

b09cbbtk3#

您不应该需要转换为字符串,也不应该依赖于在您运行的语言中可能是也可能不是十进制字符的字符进行拆分。您可以对数字进行所有计算,然后格式化输出,而无需分配除结果之外的任何字符串。

public static string FormatNumber(double number)
{
    int first = ((int)number)%1000;
    int second = (int)Math.Truncate((number-(int)number)*1000)%1000;
    return $"{first:000}.{second:000}";
}
khbbv19g

khbbv19g4#

static string Format(double number)
{
    return string.Format("{0:N3}", number % 1000).PadLeft(7,'0');
}

工作原理:
1.使用模数(%)删除高位数
1.使用format string将格式设置为三位小数
1.使用PadLeft()向左焊盘
完整示例:

using System;
using System.Collections.Generic;
public class Program
{
    public static void Main()
    {
        var tests = new Dictionary<double,string>
        {
            { 12345.678D, "345.678" },
            { 1000000.678, "000.678" },
            { 1.777888, "001.778" },
            { 99999.9, "999.900"}
        };

        foreach (var pair in tests)
        {
            Console.WriteLine("Expected: {0}  Actual: {1}", pair.Value, Format(pair.Key));
        }

    }

    static string Format(double number)
    {
        return string.Format("{0:N3}", number % 1000).PadLeft(7,'0');
    }
}

输出:

Expected: 345.678  Actual: 345.678
Expected: 000.678  Actual: 000.678
Expected: 001.778  Actual: 001.778
Expected: 999.900  Actual: 999.900

Fiddle

qjp7pelc

qjp7pelc5#

试试这个

int i = value.ToString().IndexOf(".");
string result = string.Concat(value.ToString().Substring(i - 3, 3),".", value.ToString().Substring(i + 1, 3));
Console.WriteLine(result);

相关问题