【问题标题】:String.Format decimal with sign, fixed number of decimal places, no decimal separatorString.Format 带符号小数,固定小数位数,无小数分隔符
【发布时间】:2012-06-26 10:12:23
【问题描述】:

什么是最简洁、最易读的 String.Format 使用以下标准的小数

  • 以符号(+ 或 -)开头
  • 固定的小数位数
  • 没有小数分隔符
  • 右对齐
  • 预填充“0”

例如

  • 123,45 将变为“+0012345”
  • -1123,45 将变为“-0112345”

【问题讨论】:

    标签: .net vb.net decimal string.format


    【解决方案1】:

    您几乎肯定希望将Custom numeric format string 传递给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# ;) 乘法:简单而精彩:)
    • @BorisCallens - 我认为 C# 没问题,但我们应该始终努力以选择的标记语言提供代码示例。固定位数是String.Format 唯一不能做的部分(无论如何都没有小数分隔符)所以你的两个选择是替换小数位(根据@Tim 的回答)或乘以 10 的 n 次方(根据我的回答)。
    【解决方案2】:

    也许有更好的东西,因为它看起来有点笨拙,但它确实有效。

    我指定正负格式来强制正数和固定大小字符串的加号。然后我使用InvariantCulture 将点强制为小数分隔符(我也可以使用其他文化)。最后一步是删除点。

    Dim value = -1123.45
    Dim formatted = value.ToString(
            "+00000.00;-00000.00",
            System.Globalization.CultureInfo.InvariantCulture)
    formatted = formatted.Replace(".", "")
    

    如您所见,我不知道如何指定 no 小数分隔符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 2013-11-07
      • 2014-01-04
      • 2013-04-13
      • 2021-04-19
      • 1970-01-01
      相关资源
      最近更新 更多