带符号的String.Format十进制数,固定小数位数,无小数分隔符

3
什么是最干净、最易读的方法来使用String.Format格式化一个十进制数,满足以下条件:
  • 以符号(+或-)开头
  • 小数位数固定
  • 没有小数点
  • 右对齐
  • 前缀填充“0”
例如:
  • 123.45将变成“+0012345”
  • -1123.45将变成“-0112345”
2个回答

6
您需要给自定义数字格式字符串,然后将其传递到String.Format方法中。
自定义格式字符串可以包含2个部分(第一个用于正数,第二个用于负数),您可以在其中提供字面量+-。因此,要使用7个字符进行零填充格式化,可以这样做:
String.Format("{0:'+'0000000;'-'0000000}",yourValue);

然而,这将截断小数部分,因此您的输入会产生
123.45 --> +0000123
-1123.45 --> -0001123

一个简单的解决方案是在传递给上面的方法之前将您的数字乘以100(以固定小数位数为2)。

现场示例:http://rextester.com/SZR8690(C# - 抱歉,但只演示了这个想法)

然后可以将其封装成扩展方法:

<Extension()> 
Public Function ToFixedFormat(ByVal value As Decimal, ByVal numFractionalDigits As Integer)
    Return String.Format("{0:'+'0000000;'-'0000000}",value * Math.Pow(10,numFractionalDigits))
End Function

实时示例: http://rextester.com/LSAAA60214 (VB.NET)


别担心,我也精通C# ;) 乘法:简单而卓越 :) - Boris Callens
@BorisCallens - 我认为C#应该没问题,但我们应该始终努力提供所选语言的代码示例。固定位数是String.Format无法做到的唯一部分(至少没有小数点)。因此,你有两个选择:替换小数点(如@Tim的答案)或乘以10的n次方(如我的答案)。 - Jamiec

3
也许有更好的方法,因为它看起来有点笨拙,但它能够正常工作。
我指定了正负格式以强制正数使用加号,并使用固定大小字符串。然后我使用"InvariantCulture"来强制小数点作为十进制分隔符(我也可以使用其他文化)。最后一步是删除小数点。
Dim value = -1123.45
Dim formatted = value.ToString(
        "+00000.00;-00000.00",
        System.Globalization.CultureInfo.InvariantCulture)
formatted = formatted.Replace(".", "")

正如您所看到的,我不知道如何指定没有小数分隔符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接