【问题标题】:Overriding Ext.util.Format.thousandSeparator except when formatting money覆盖 Ext.util.Format.thousandSeparator 除非格式化钱
【发布时间】:2014-09-05 16:11:34
【问题描述】:

我正在尝试覆盖 Ext.util.Format.decimalSeparator 和千位分隔符。因此,在我的应用程序中,当我将语言更改为西班牙语并尝试使用此函数时,Ext.util.Format.number(1234,'$0,000') 仍然会将数字转换为 1.234 而不是 1,234。

我希望这样,无论我选择哪种语言,它应该始终将钱格式化为 0,000 美元的格式,而不是使用我选择的语言环境,例如,永远不要 0.000 美元。我观察到如果我更改 Ext.util.Format 对象的千位分隔符,它工作正常。所以,我在Application.js的launch函数中的Ext.Loader.loadScript回调函数中添加了如下代码,

        var utilFormatObj={};
        utilFormatObj.thousandSeparator = ",";
        utilFormatObj.decimalSeparator = ".";
        Ext.override(Ext.util.Format, utilFormatObj);

但是,它似乎只在这个地方工作,一旦它在网页上加载应用程序,它又会回到千分隔符 =“。”。我可以看到 ext-lang-es.js 文件具有设置这些属性的功能。谁能建议我如何捕捉应用程序是否完全加载到 webapge 上,然后在那里使用上面的代码。谢谢。

【问题讨论】:

    标签: extjs extjs4 extjs4.1 extjs4.2 extjs-mvc


    【解决方案1】:

    当您调用 Ext.util.Format.number() 时,您并没有指定使用什么作为小数或千位分隔符,您只是指定精度、是否显示千位分隔符以及是否用零填充精度。

    The documentation for Ext.util.Format.number 状态:

    格式字符串必须根据美国/英国惯例指定分隔符(“,”作为千位分隔符,“.”作为小数分隔符)

    因此,如果您想在不同的语言环境中显示数字,则必须在调用 Ext.util.Format.numberExt.util.Format.currency 之前运行更改默认分隔符的代码。

        var value = 202020.20, format = "0,000.0000";
        // Print in Spanish
        Ext.util.Format.thousandSeparator  = ".";
        Ext.util.Format.decimalSeparator  = ",";
        alert(Ext.util.Format.number(value, format));
    
        // Print in Swedish French
        Ext.util.Format.thousandSeparator  = "'";
        Ext.util.Format.decimalSeparator  = ",";
        alert(Ext.util.Format.number(value, format));
    
        // Print in English
        Ext.util.Format.thousandSeparator  = ",";
        Ext.util.Format.decimalSeparator  = ".";
        alert(Ext.util.Format.number(value, format));        
    

    如果您真的想指定货币应始终使用句点作为千位分隔符,但仍让 Ext.util.Format.number 使用所选区域设置的分隔符,则可以使用以下技巧。

    function formatMoney(amount, sign, decimals, end) {
       // Save the thousand separator
       var thousandSep =  Ext.util.Format.thousandSeparator;
       Ext.util.Format.thousandSeparator = '.';
       var formatted =  Ext.util.Format.currency(amount, sign, decimals, end);
       // restore the thousand separator
       Ext.util.Format.thousandSeparator = thousandSep;
       return formatted;
    }
    

    以上代码示例 sn-ps:https://fiddle.sencha.com/#fiddle/9vm

    【讨论】:

      【解决方案2】:

      我猜您在构建应用程序进行部署后没有使用加载程序。通常动态加载器仅用于开发(因此您可以单独查看每个脚本),并且您在 prod 中使用更快的方法。

      您可以在 Ext.define 的回调中加载您的 Ext 覆盖:

      Ext.define( className, data, [createdFn] )
      

      其中 createdFn 是一个包含您的 Ext 覆盖的函数。如果您在应用覆盖之前调用该 Format 对象,此方法可能会导致竞争条件。为了有信心,您可以添加另一个带有覆盖的 JS 文件(在加载 Ext 之后,在您的应用代码之前),并确保在加载您的应用时包含该文件。

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 1970-01-01
        • 2021-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多