最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Flutter中数字金额转大写

    正文概述 掘金(路过看风景)   2021-01-20   468

    来源 www.jianshu.com/p/016a6d1a1…

    项目中需要将数字金额转换成大写,Flutter没找到相关的工具,所以这里自己写了一个
    主要思路是将金额*100,然后四舍五入转int类型
    从最后一位开始进行转换
    转换中如果每一位数字转换汉字,添加单位。

    0 单独处理,汉字大写的规则,多个0,作为一个处理,关键单位(元,万,亿,兆)后加零,前不加,所以设置了3个标识符:
    lastZero标识符确定了上一个是不是零,如果是,则跳过。
    tag标识符确定了上一次转换关键单位后是不是有非零数字。
    tag2标识符表示从上次关键单位到现在是否存在一个非零数字(新更新代码)
    整段代码在2个地方进行加零操作:1、添加关键单位之前,2、添加非零数字之前。

    注意长度

    下面是代码

    convertNumToChinese(double num) {
        final List<String> CN_UPPER_NUMBER = [
          "零",
          "壹",
          "贰",
          "叁",
          "肆",
          "伍",
          "陆",
          "柒",
          "捌",
          "玖"
        ];
        final List<String> CN_UPPER_MONETRAY_UNIT = [
          "分",
          "角",
          "圆",
          "拾",
          "佰",
          "仟",
          "万",
          "拾",
          "佰",
          "仟",
          "亿",
          "拾",
          "佰",
          "仟",
          "兆",
          "拾",
          "佰",
          "仟"
        ];
        final String CN_FULL = "整";
        final String CN_NEGATIVE = "负";
        final String CN_ZEOR_FULL = "零圆" + CN_FULL;
        double sign = num.sign;
        if (sign == num) {
          return CN_ZEOR_FULL;
        }
        if (num.toStringAsFixed(0).length > 15) {
          return '超出最大限额';
        }
        num = num * 100;
        int tempValue = int.parse(num.toStringAsFixed(0)).abs();
    
        int p = 10;
        int i = -1;
        String CN_UP = '';
        bool lastZero = false;
        bool finish = false;
        bool tag = false;
        bool tag2 = false;
        while (!finish) {
          if (tempValue == 0) {
            break;
          }
          int positionNum = tempValue % p;
          double n = (tempValue - positionNum) / 10;
          tempValue = int.parse(n.toStringAsFixed(0));
          String tempChinese = '';
          i++;
          if (positionNum == 0) {
            if (CN_UPPER_MONETRAY_UNIT[i] == "万" ||
                CN_UPPER_MONETRAY_UNIT[i] == "亿" ||
                CN_UPPER_MONETRAY_UNIT[i] == "兆" ||
                CN_UPPER_MONETRAY_UNIT[i] == "圆") {
              if (lastZero && tag2) {
                CN_UP = CN_UPPER_NUMBER[0] + CN_UP;
              }
              CN_UP = CN_UPPER_MONETRAY_UNIT[i] + CN_UP;
              lastZero = false;
              tag = true;
              continue;
            }
            if (!lastZero) {
              lastZero = true;
            } else {
              continue;
            }
          } else {
            if (lastZero && !tag && tag2) {
              CN_UP = CN_UPPER_NUMBER[0] + CN_UP;
            }
            tag = false;
            tag2 = true;
            lastZero = false;
            tempChinese = CN_UPPER_NUMBER[positionNum] + CN_UPPER_MONETRAY_UNIT[i];
          }
          CN_UP = tempChinese + CN_UP;
        }
        if (sign < 0) {
          CN_UP = CN_NEGATIVE + CN_UP;
        }
        return CN_UP;
      }
    

    附:金额验证正则表达式

              RegExp e = RegExp(r'^\d+(\.\d+)?$');
    

    PS:初步测试可用,期待后续的BUG反馈


    起源地下载网 » Flutter中数字金额转大写

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元