【发布时间】:2020-09-18 06:23:55
【问题描述】:
我开发了以下简短函数,将传递给它的数字以字符串格式拆分为 Whole 和 Fractional 部分(也输出为字符串)。
注意1:数字的整数部分可以变成大数字(超过50位)。
注意 2:输出结果(整数和分数字符串)不会被转换为整数或浮点数,但由于 Javascript 对大数字的舍入,将仅作为字符串进一步操作.所以回到数字不是问题
因为函数会自动检测机器的区域设置,因此希望用户在其本地机器的区域设置中输入(传递)数字,否则该数字会以编程方式生成并传递给功能。
由于长度非常大,并且没有处理以指数 (e) 格式传递的数字,因此预计该数字将作为“字符串”传递。
该函数使用 toLocaleString() 来检测小数和千位分隔符。
我已经用主要数字系统(.,'空格)测试了这个函数,到目前为止,一切都很好。
问题是,这段代码的安全性如何,是否有其他更好、更安全的方法来执行此操作或进行必要的更正/更改?
谢谢
function splitFloatString(NumString) {
var decimalSeparator = (1.1).toLocaleString().substring(1,2); // Get Decimal Separator
var thousandSeparator = (1000).toLocaleString().substring(1,2); // Get Thousands Separator
NumString += ""; // ensure a string
var fraction ="0"; // default no fractional part
NumString = NumString.replace(RegExp("\\"+thousandSeparator,"g"),""); //remove thousand separators if any
if (RegExp("\\"+decimalSeparator,"g").test(NumString)) { // test for decimal separator
var n = NumString.split(decimalSeparator); // Split at Decimal Seprator
NumString = n[0]; // The Whole part
if (n.length==2) fraction = n[1]; // The Fractional part
if (fraction=="") fraction ="0";
}
console.log("Whole: ("+NumString+"), Fraction: ("+fraction+")"); // added for testing
//return n=[NumString,fraction]; // normal return uncomment
}
//------------------------------------------------------------------------------------
// Tests assuming user's machine and user enters/passes US-EN separators as an example
//------------------------------------------------------------------------------------
splitFloatString("123456789123456699999887788812340786.45678907656912574321115194123123456789");
splitFloatString("1,234,567,891,234,566,999,998,888,812,340.456520754186789075194123123456789");
splitFloatString("200")
splitFloatString("0.")
splitFloatString(123456.2349999)
splitFloatString("")
splitFloatString()
【问题讨论】:
-
输入来自什么环境?如果也来自 JavaScript,我建议您遇到指数数字
3.51e+41例如。 -
@AhmedHammad 同意。但这需要添加代码以将指数数字转换为完整的字符串等价物。这是可能的。谢谢
标签: javascript floating-point numbers rounding