【问题标题】:asp.net mvc set number format default decimal thousands separatorsasp.net mvc 设置数字格式默认十进制千位分隔符
【发布时间】:2012-10-26 11:56:25
【问题描述】:

如何在 asp.net mvc 中设置默认的十进制和千位分隔符来格式化数字而不考虑文化?

【问题讨论】:

    标签: asp.net-mvc number-formatting


    【解决方案1】:

    您可以创建一个DisplayTemplate 来处理此类数字在您的视图中的显示方式:

    /Views/Shared/DisplayTemplates/float.cshmtl:

    @model float
    @string.Format("{0:N2}", Model);
    

    如果Amount 的类型是float,那么你可以从你的观点中这样称呼它:

    @Html.DisplayFor(m => m.Amount)
    

    【讨论】:

    • 那么这个模板是怎么引用的呢?
    【解决方案2】:

    要控制千位分隔符,您必须将更改应用于当前区域性的 NumberFormat

    如果您希望无论当前文化如何都发生这种情况,您可以简单地克隆当前文化,应用您修改后的 NumberFormat 并将其设置为当前文化。

    在 MVC 应用程序中,您通常会在 Application_BeginRequest 期间执行此操作

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        newCulture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
        newCulture.NumberFormat.NumberGroupSeparator = "~";
    
        System.Threading.Thread.CurrentThread.CurrentCulture = newCulture;
        System.Threading.Thread.CurrentThread.CurrentUICulture = newCulture;
    }
    

    现在您可以使用 ToString() 的“普通”格式选项来根据您的需要进一步控制格式:

    var a = 3000.5;
    var s = a.ToString('N:2') // 3~000.50
    s = a.ToString('N:4') // 3~000.5000
    

    【讨论】:

    • 更新 System.Threading.Thread.CurrentThread.CurrentCulture 不起作用,因为它导致了其他错误。我可以举个例子:当我尝试在 Number 中转换默认格式的字符串(例如“14543.12”)时,它会抛出错误。这是有道理的。无论如何,谢谢你的帮助
    【解决方案3】:

    您需要指定自定义数字格式才能实现您要查找的内容。 Here is the MSDN 关于创建自定义字符串格式化函数。

    如果您确实需要自定义千位分隔符,请创建您自己的 NumberFormatInfo 变量,将您想要的值分配给千位分隔符(如果需要,还可以使用小数)。然后将自定义格式应用于您的号码。

    var numberFormatter = new CultureInfo( "en-US", false ).NumberFormat;
    numberFormat.NumberDecimalSeparator = ";";
    numberFormat.NumberGroupSeparator = "-";
    var myNumber = 1234567.89;
    var myFormattedNumber = myNumber.ToString("#,###.##", numberFormatter);
    
    //myFormattedNumber -> 1-234-567;89
    

    关于NumberFormat class from the MSDN的一些信息

    【讨论】:

      【解决方案4】:

      variable.ToString("n2") - 这在 ASP.Net MVC Razor 中对我有用。

      【讨论】:

        【解决方案5】:
        string.Format("{0:N2}", yourLovelyNumber);
        

        【讨论】:

        • 好的,但是我希望能够自己指定小数和千位分隔符,我该怎么做?
        【解决方案6】:

        我将发布最终对我有用的代码。在控制器上,在 OnActionExecuting 函数上:

        ViewBag.CurrentNumberFormat = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
        ViewBag.CurrentNumberFormat.NumberDecimalDigits = 2;
        ViewBag.CurrentNumberFormat.NumberDecimalSeparator = "~";
        ViewBag.CurrentNumberFormat.NumberGroupSeparator = " ";
        

        在视图中:

         @((1234567.435).ToString("#,###.##", ViewBag.CurrentNumberFormat))
        

        【讨论】:

        • 这与我在下面发布的内容有何不同 :( 很高兴你成功了!
        • 这是不同的,因为每当我需要格式化一个数字时,我不必编写 5 行代码而不是 1 行。您的帖子确实很有帮助和鼓舞人心,谢谢
        【解决方案7】:

        我有同样的问题,可以推荐 autoNumeric 插件https://github.com/autoNumeric/autoNumeric

        包含插件:

        <script src="~/Scripts/autoNumeric/autoNumeric.min.js" type="text/javascript"></script>
        

        HTML:

         <input type="text" id="DEMO" data-a-sign="" data-a-dec="," data-a-sep="." class="form-control"> 
        

        脚本:

        <script>
         jQuery(function($) {
        $('#DEMO').autoNumeric('init');   
         });
        </script>
        

        您只能输入数字,如果输入 100000,99,您将看到 100.000,99。

        【讨论】:

        • 截至今天,在当前稳定版本4 中不再支持旧的 jQuery 表示法。这行不通。只需使用 new AutoNumeric('#DEMO') 就可以了!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多