币种大写算法(js)
注意事项:小数精度处理问题,n*10出现精度误差,如1.88*10计算得18.799999999999997,实际想要的数据是18.8;
思路一:小数变成整数(通过字符串处理),计算后,变成小数; 思路二:用科学计算法进行计算。
export function RMBFitter(n){
/**金额大写的转换 */
var fraction = ['角', '分'];
var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
var unit = [ ['元', '万', '亿'], ['', '拾', '佰', '仟'] ];
//var head = n < 0? '欠': '';
n = Math.abs(n);
var s = '';
// if (n > Math.floor(n)) {
// let str = n * 100 + ''
// let numlist = str.substr(-2, 2).split('')
// // 这里在前面取数的时候定死了2位小数。0
// let num0 = numlist[0] - 0
// let num1 = numlist[1] - 0
// if (num1 === 0 && num0 === 0) {
// s = ''
// } else if (num1 === 0) {
// s = digit[num0] + '角'
// } else {
// s = digit[num0] + '角' + digit[num1] + '分'
// }
// }
// console.log((digit[Math.floor(n * Math.pow(10, 1)) % 10] + fraction[0]).replace(/零./, ''));
// console.log((digit[Math.floor(n * Math.pow(10, 2)) % 10] + fraction[1]).replace(/零./, ''));
for (var i = 0; i < fraction.length; i++)
{
// console.log(digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]);
s += (digit[Math.floor(n * Math.pow(10, i+1)) % 10] + fraction[i]).replace(/零./, '');
}
s = s || '整';
n = Math.floor(n);
for (var i = 0; i < unit[0].length && n > 0; i++)
{
var p = '';
for (var j = 0; j < unit[1].length && n > 0; j++)
{
p = digit[n % 10] + unit[1][j] + p;
n = Math.floor(n / 10);
}
s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
}
//return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
var result = s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
if(result.indexOf('分')>0&&result.indexOf('角')<0){
result = result.replace(/元/g, '元零');
}
return result;
}
以上处理方式在处理小数的时候,会有精度问题(2374.24),因此需要单独处理小数部分,先将小数部分变成字符串,然后再做处理
let nString = n + '';
if(nString.indexOf('.')>-1){
nString = nString.split('.');
nString = nString[1];
if(nString.length>2){
alert('请确保输入的值不能超过两位小数,否则无法核算成大写金额');
return;
}
if(nString.length>1){
let jiao = nString[0];
let fen = nString[1];
s = (digit[Number(jiao)] + '角' + digit[Number(fen)]+ '分').replace(/零./, '');
}else{
let jiao = nString;
s = (digit[Number(jiao)] + '角');
}
}
币种大写算法(js)的更多相关文章
- 微信小程序存放视频文件到阿里云用到算法js脚本文件
peterhuang007/weixinFileToaliyun: 微信小程序存放视频文件到阿里云用到算法js脚本文件 https://github.com/peterhuang007/ ...
- JS设置首字母大写算法
返回一个字符串,确保字符串的每个单词首字母都大写,其余部分小写. 像'the'和'of'这样的连接符同理. function titleCase(str) { //把字符串所有的字母变为小写,并根据空 ...
- 几种常见算法js
没有系统地总结过js算法,虽然在项目中陆陆续续的也用过好多算法,有一次去一家公司面试的时候,面试官说想谈谈算法,有点懵了,所以接下来的面试中谈的也有点被动,避免下次再碰到这种情况,今天决定好好的总结下 ...
- 算法——js(Fibonacci数列)
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家列昂纳多·斐波那契(Leonardoda Fibonacci[1] )以兔子繁殖为例子而引入,故又称为“兔子数列”,指 ...
- 斐波那契数列公式算法-JS实现
之前算斐波那契数列都是算前两个数相加实现的 比如0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181 ...
- 将单词首字母大写的JS脚本工具
<html> <head> <title>首字母全改为大写JS脚</title> <SCRIPT LANGUAGE="JavaScrip ...
- 数据结构与算法JS实现
行解算法题,没错,就是这么方便. 当然也可以使用 Node.js 环境来执行,具体参考Node.js官方文档即可. 二 对象和面向对象编程 js中5种数据类型,并没有定义更多的数据类型,但是运用j ...
- 八大排序算法JS及PHP代码实现
从学习数据结构开始就接触各种算法基础,但是自从应付完考试之后就再也没有练习过,当在开发的时候也是什么时候使用什么时候去查一下,现在在学习JavaScript,趁这个时间再把各种基础算法整理一遍,分别以 ...
- KMP算法JS实现
参考阮一峰的<字符串匹配的KMP算法>,用JS实现一版,备忘~ // 主串 let str1 = 'BBC ABCDAB ABCDABCDABDEDC'; // 模式串 let str2 ...
随机推荐
- iscsi序列二、iscsi多路径配置方式
一.ISCSI多路径应用 如果存储服务器到交换机只有一条线路的时候,那么一条线路出线故障,整个就没法使用了,所以多线路可以解决这个问题,避免单点故障 如上图,如果SAN服务器与客户端交换机只有一条线路 ...
- 阿里云Centos7挂载数据盘
查看磁盘情况 fdisk -l fdisk /dev/vdb 根据提示,分别输入 n. p. . enter.enter.wq fdisk -l mkfs.ext3 /dev/vdb1 挂载磁盘,写入 ...
- React Native使用Redux总结
1>npm安装redux: "react-redux": "^5.0.5", "redux": "^3.7.1", ...
- jenkins密码忘记解决
1.停止jenkins sh /usr/local/tomcat/bin/shutdown.sh 2.找到config.xml [root@test3 hello]# find / -name con ...
- 数据测试001:利用python连接数据库插入excel数据
数据测试001:利用python连接数据库插入excel数据 最近在做数据测试,主要是做报表系统,需要往数据库插入数据验证服务逻辑,本次介绍如何利用python脚本插入Oracle和Mysql库中: ...
- Python3 Selenium自动化web测试 ==> 第六节 WebDriver高级应用 -- 操作web页面的滚动条
学习目的: 掌握页面元素定位以外的其他重要知识点. 正式步骤: 测试Python3代码 # -*- coding:utf-8 -*- from selenium import webdriver fr ...
- FUZZ测试简介
基本思想:利用黑盒方法,发送大量恶意/随机数据到被测试系统,通过监视系统运行过程中的异常,来发现应用程序中可能存在的安全问题.
- jQuery代码书写规范
1. 对于同一个对象不超过三个操作的,可以直接写成一行 $("li").show().unbind("click"); 2. 对于同一个对象的较多操作,建议每行 ...
- addRoutes进行权限控制
用addRoutes实现动态路由:https://www.jianshu.com/p/0bea4a1b0350 详解基于vue,vue-router, vuex以及addRoutes进行权限控制:ht ...
- Python 中__new__()和__init__()的区别
转自: https://blog.csdn.net/weixin_37579123/article/details/89515577 __new__方法:类级别的方法 特性: 1.是在类准备将自身实例 ...