Dart中的货币格式(按区域设置)

时间:2019-09-24 15:31:28

标签: flutter dart internationalization intl

我能够使用以下货币格式获取数字:

    string ExtractTAG(string s, int offset)
    {
        string org = s.Substring(offset, s.Length - offset);
        s = s.Substring(offset + 1, s.Length - offset - 1);

        int shift = 0;
        int level = 1;
        int n = 0;
        int nextClose;
        int nextOpen;
        int CheckPoint = 0;

        while (level != 0 && n < 40)
        {
            nextClose = s.IndexOf("</g>");
            nextOpen = s.IndexOf("<g ");

            if (nextClose == -1)
            {
                //no next closing point => corrupt file
                return "";
            }
            if (nextClose < nextOpen || nextOpen == -1)
            {
                CheckPoint = nextClose;
                level = level - 1;
            }
            else if (nextClose > nextOpen)
            {
                CheckPoint = nextOpen;
                level = level + 1;
            }

            shift = shift + CheckPoint;
            n = n + 1;
            s = s.Substring(CheckPoint + 1, s.Length - CheckPoint - 1);
        }
        if (n == 40)
        {
            return "Length could not be determined after 40 iteration - SVG might be courrupt";
        }
        return org.Substring(0, shift + n + 4);
    }

结果是:

语言环境“ en_US”:$ 1,234.00

对于语言环境“ es”或“ es_AR”:1.234,00 $

在第一种情况下(en_US)是正确的,但在最后一种情况下(es_AR)是阿根廷西班牙语(我的国家),这是错误的,我们在末尾不使用符号,而是在前面使用像美国一样,但是点/逗号是正确的。

这是图书馆的错误?有没有解决的办法?

谢谢

2 个答案:

答案 0 :(得分:1)

似乎尚未添加es_AR之类的内容,因此它又可以归结为其他内容,也许是es?也许您可以为该软件包做出贡献并自己添加它?我猜这是应该去的地方https://github.com/dart-lang/intl/blob/master/lib/number_symbols_data.dart

编辑:如前所述,该文件是从CLDR生成的,因此不应更改dart文件。也许您可以将问题提交到github页面,或者寻求Alan Knight建议的解决方案。

答案 1 :(得分:1)

如上所述,es_AR不在数据中。您不能修改该文件,因为它是从CLDR数据生成的,并且将被覆盖。但是您可以在运行时对其进行修改以添加缺失的条目或修改现有的条目。例如,在这里我创建了一个条目,并在其中输入了“ es”条目,并将货币符号(\ u00a4)移到了开头。

import 'package:intl/intl.dart';
import 'package:intl/number_symbols.dart';
import 'package:intl/number_symbols_data.dart';

main() {
  var argentina = NumberSymbols(
      NAME: "es_AR",
      DECIMAL_SEP: ',',
      GROUP_SEP: '.',
      PERCENT: '%',
      ZERO_DIGIT: '0',
      PLUS_SIGN: '+',
      MINUS_SIGN: '-',
      EXP_SYMBOL: 'E',
      PERMILL: '\u2030',
      INFINITY: '\u221E',
      NAN: 'NaN',
      DECIMAL_PATTERN: '#,##0.###',
      SCIENTIFIC_PATTERN: '#E0',
      PERCENT_PATTERN: '#,##0\u00A0%',
      CURRENCY_PATTERN: '\u00A4#,##0.00\u00A0',
      DEF_CURRENCY_CODE: r'$');

  numberFormatSymbols['es_AR'] = argentina;
  var f = NumberFormat.currency(locale: 'es_AR');
  print(f.format(1234));

}