【问题标题】:Accounting Style string format in ASP.NETASP.NET 中的会计样式字符串格式
【发布时间】:2017-05-24 23:24:06
【问题描述】:

我想知道将字符串格式化为会计样式的最简单方法。我知道如何使用 {0:c} 将格式设置为货币,但会计风格存在一些差异,例如,所有美元符号和所有小数点都将对齐,并且负数用括号表示,而不是用 a “-”减号。如果您将单元格格式设置为带 2 位小数的“会计”,您可以在 excel 中找到一个很好的示例。

【问题讨论】:

    标签: asp.net string-formatting


    【解决方案1】:

    忽略您的对齐要求,您可以使用

    number.ToString("€#,##0.00;(€#,##0.00);Zero")
    

    将负数括起来。

    要对齐您的数字,您必须在没有货币符号的情况下进行格式化,并用空格自己填充格式化的数字,使用固定宽度的字体会让您更轻松地完成这项工作。

    编辑:

    看来 String.Format 是你的朋友:

    String.Format("{0,15:#,##0.00 ;(#,##0.00);-   }", number)
    

    其中 15 是输出的总宽度,您需要将此文本附加到您的货币符号。 (同样,这仅以固定宽度对齐)

    【讨论】:

      【解决方案2】:

      没有用于处理会计样式格式 (here's a cheat sheet with the available format strings) 的格式字符串快捷方式(具有默认规则的单字符快捷方式),因此您必须编写更具体的快捷方式(如 Patrick 的答案)或您自己的解析方法。

      对齐要求将取决于您如何显示它们。我假设您使用的是表格,在这种情况下,您会受到 HTML 支持的限制,并且它不支持 Excel 等会计样式对齐方式。

      【讨论】:

      • +1 - 我只是在寻找可打印的格式字符串列表
      【解决方案3】:

      this blog 中列出了一些不同的格式,这似乎与您要查找的内容接近:

      int neg = -10;
      int pos = 10;
      // C or c (Currency): It represent how many decimal place of zeros to show.
      String.Format("{0:C4}", pos);      //"$10.0000"
      String.Format("{0:C4}", neg);      //"($10.0000)"
      

      它不处理填充(您可能必须自己修复它),但它确实有正确的括号。

      【讨论】:

      • 这是特定于文化的,可能不适用于每种文化。
      【解决方案4】:

      您可以使用帕特里克方法的变体来做一些事情。假设您知道要处理的值的上限,这将处理格式化和对齐:

      private static string OutputAsCur(decimal val)
      {
          string format = "  #,##0.00 ; (#,##0.00);Zero";
          string frmt = val.ToString(format);
          return CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol + frmt.PadLeft(15, ' ');
      }
      

      这是一个简单的示例应用程序,可以查看它的格式:

          static void Main(string[] args)
          {
              decimal d = 155.55m;
      
              Console.WriteLine(OutputAsCur(d));
              Console.WriteLine(OutputAsCur(d * -1));
              Console.WriteLine(OutputAsCur(1002.32m));
              Console.WriteLine(OutputAsCur(1002.32m * -1));
              Console.ReadLine();
           }
      

      【讨论】:

        【解决方案5】:

        您可以使用 String.Format 的格式字符串来获取您想要完成的任务。唯一的技巧是正数,因为它们没有右括号标记,如果它们与列中的任何负数对齐,则必须在末尾包含一个空格。诀窍是以 HTML 不会忽略的方式将该空间放入字符串中。我只是使用 HTML 实体  这表示 HTML 中的不间断空格。

        这里是示例代码。首先,在aspx中。

        <table>
        ...
            <tr>
                <th scope="row" colspan="2">Total Revenue</th>
                <td class="numeric total"><asp:Label runat="server" ID="TotalRevenueLabel" /></td>
            </tr>
        ...
        </table>
        

        现在,代码隐藏。

        public const string kMoneyFormat = "#,#.00'&nbsp;';(#,#.00);'-.--&nbsp;'";
        
        public void DataBind()
        {
            using (FinancialDataContext sql = new FinancialDataContext())
            {
                var periodQuery = from m in sql.Forecasts()
                                  select m;
                ForecastsResult periodData = periodQuery.Single();
                decimal totalRevenue = period.Data.income_actual.Value + periodData.other_income.Value;
                TotalRevenueLabel.Text = totalRevenue.ToString(kMoneyFormat);
            }
        }
        

        【讨论】:

          【解决方案6】:

          我按照这些步骤应用“会计”格式。

          • 在新的 Excel 书籍中,选择一个单元格。
          • 插入数据(即任意数字;在本例中,添加 80000)
          • 选择(会计)NumberFormat,如屏幕截图 #1 所示:

          屏幕截图 #1:

          • 选择“更多数字格式”。
          • 选择“自定义”。
          • 选择任何预定义的公式(参见屏幕截图 #2)

          截图#2:

          在我的例子中,这是这个数字所需的格式。


          负面的一面是,当您选择应用了格式的单元格时,您不会在 DropDownList 数字格式中看到选中的(会计)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-09
            • 1970-01-01
            • 2011-03-21
            • 1970-01-01
            • 1970-01-01
            • 2019-03-04
            相关资源
            最近更新 更多