javascript - 如何用更少的行数优化下面的代码?
问题描述
我编写了以下代码,它处理大于 999 的数字并在其中添加逗号。例如 1,000 和 1,000,000。当数字增加时,逗号将被放置在正确的位置。我使用了 DRY 原则,我觉得还有另一种简单的方法来处理它。现在,我想知道是否有比我做的更好的方法。等待您的意见。
谢谢。
function seperate_num_by_comma() {
var num = '199228754645.25',
withOutComma = num.split('.'),
addNewCommaAfter = 3,
x = withOutComma[0].length % addNewCommaAfter,
lenOfWithOutComma_0 = withOutComma[0].length,
length_1 = withOutComma[0].length - x,
starter = 0,
wholeNumber = ' ';
for (var i = 0; i < lenOfWithOutComma_0; i++) {
function run_first_func() {
wholeNumber += withOutComma[0].substr(starter, addNewCommaAfter);
};
function run_second_fun() {
wholeNumber += withOutComma[0].substr(starter, addNewCommaAfter) + ",";
starter += addNewCommaAfter;
length_1 -= addNewCommaAfter;
};
if (x > 0) {
if (length_1 == 0) {
run_first_func();
break;
} else if (wholeNumber == ' ') {
wholeNumber += withOutComma[0].substr(starter, x) + ",";
length_1 -= addNewCommaAfter;
starter = x;
} else {
run_second_fun();
}
} else if (x == 0) {
if (length_1 == 3) {
run_first_func();
break;
}
run_second_fun();
}
}
console.log(wholeNumber + '.' + withOutComma[1]);
}
seperate_num_by_comma();
解决方案
一条线:
165B缩小版(无IE):seperate_by_comma=t=>(x=(""+t).split("."),z=x[0].replace(/((\d{3})*?)(\.|$)/,"|$1").split("|"),x[0]=z[0]+z[1].replace(/(.{3})/g,",$1").slice(!z[0].length),x.join("."))
或 180B,对 IE 友好:seperate_by_comma=function(t){x=(""+t).split(".");z=x[0].replace(/((\d{3})*?)(\.|$)/,"|$1").split("|");x[0]=z[0]+z[1].replace(/(.{3})/g,",$1").slice(!z[0].length);return x.join(".")}
解释:
seperate_num_by_comma = function(number){//12345678.9
var str = String(t);
var withoutDot = str.split("."); //["12345678", "9"]
var chunksOfThree = withoutDot[0].replace(/((\d{3})*?)(\.|$)/,"|$1");//"12|345678"
chunksOfThree = chunksOfThree.split("|");//["12", "345678"]
chunksOfThree[1] = chunksOfThree[1].replace(/(.{3})/g,",$1") //",345,678"
if(chunksOfThree[0].length==0){
chunksOfThree[1] = chunksOfThree[1].slice(1); //Fix for specific cases
}
withoutDot[0] = chunksOfThree[0] /*"12"*/ + chunksOfThree[1] /*",345,678"*/
return withoutDot.join(".") //"12,345,678.9"
}
推荐阅读
- docker - 如何从非 root 用户运行 docker 容器?
- python - Py3:无法打开文件/snapshot/serverless/lib/plugins/aws/invokeLocal/invoke.py:没有这样的文件或目录
- angular - Angular 9 延迟加载组件错误:InjectionToken mat-autocomplete-scroll-strategy 没有提供程序
- reactjs - `isLoading` 状态是否应该在 Redux 中?但是如果可以有多个加载数据的组件呢?
- snowflake-cloud-data-platform - 通过填写 Alteryx 中的值来修改雪花数据库
- r - 使用 ggplot2 绘制 TIFF 数据
- python-3.x - Kivy Buildozer 不构建 apk
- html - 为什么将带有线性渐变和图像的css背景图像放在html样式标签中,但放在样式表中时却不行?
- c# - 您可以将集合包含的对象的一个属性序列化为 JSON
- java - 使 OpenJ9 类共享也共享非引导类