我在使用ToString()方法本地化数字时遇到了一些问题:

ToString("Nx")正确地本地化了所有的数千个分隔符,但向whole numbers添加了不必要的尾随0,这在我的UI中看起来相当难看.另一方面,像ToString("0.###")这样的东西正好按照我想要的方式处理小数,但它没有正确地包括千分隔符.

我希望字符串保留我想要的小数位数,而不是添加尾随的0来填充空格.

float a = 1900.42f;

//Expected result: 1,900.42
a.ToString("N2"); //1,900.42 (Perfect!)
a.ToString("0.##"); //1900.42 (Missing separators)

float b = 1900;

//Expected result: 1,900
b.ToString("N2"); //1,900.00 (Localized, unnecessary 0s)
b.ToString("0.##"); //1900 (Missing separators, no 0s)

Is there any way to have both?目前我勉强加了一句:

.Trim('0').Trim(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0])

但这感觉太多了,而且没有必要,我不得不假设小数分隔符只是一个字符.感觉应该有一种方法来做我想要的已经做好的东西,我只是找不到它.

推荐答案

要在输出中包含组(千)分隔符,格式字符串只需在任意两个数字占位符(#0)之间使用逗号(,)即可.对于您给出的两个具体示例,格式字符串"#,0.##"产生所需的结果:

float a = 1900.42f;
Console.WriteLine(a.ToString("#,0.##")); // 1,900.42 for the en-US culture
float b = 1900;
Console.WriteLine(b.ToString("#,0.##")); // 1,900

如果不想硬编码小数位数,则可以改用当前区域性指定的默认小数位数:

string format = $"#,0.{new string('#', NumberFormatInfo.CurrentInfo.NumberDecimalDigits)}";
float a = 1900.42f;
Console.WriteLine(a.ToString(format)); // 1,900.42
float b = 1900;
Console.WriteLine(b.ToString(format)); // 1,900

注意:格式字符串"#,#.##"(Wyck的答案)将生成""(空字符串),而不是表示零的"0".

Csharp相关问答推荐

Rx.Net -当关闭序列被触发时如何聚合消息并发出中间输出?

Dapper是否可以自动扩展类成员

禁用AutoSuggestBox项目更改时的动画?

. NET 8 HttpClient post参数将其情况更改为camel'

通过EFCore上传大量数据.

使用LayoutKind在C#中嵌套 struct .显式

Unity 2D自顶向下弓旋转

如何在C#中使用正则表达式抓取用逗号分隔的两个单词?

从应用程序图API调用访问所有者字段

S能够用DATETIME来计算,这有什么错呢?

附加标题不起作用,而添加则起作用

如何在C#中实现非抛出`MinBy`?

Unix上的.NET(核心):.NET意外地未看到通过P/Invoke系统调用对环境变量进行的进程内修改

TeamsBot SendActivityActivityTypes与ActivityTypes同步.键入不再起作用

在C#中反序列化/序列化具有混合元素顺序的XML时出现问题

具有以接口为其类型的属性的接口;类指定接口的实现,但无效

什么类型的对象存储在大对象堆(LOH)中

JsonPath在Newtonsoft.Json';S实现中的赋值

如何使用.NET 8.0中新的CompositeFormat类?

从HTML元素获取 colored颜色