将"Floating Point Number String"拆分为整体和部分的最安全方法



我开发了以下短函数,以字符串格式将传递给它的数字拆分为整数和小数部分(也输出为字符串(。

注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()

据我说,你只是不必要地使整个事情复杂化。这是实现相同结果的简单方法。

function getLocaleSeparators() {
const testNumber = 1000.1.toLocaleString()
return [testNumber.substring(1,2), testNumber.substring(5,6)]
}
function splitFloatString(number) {
const numberString = number.toString()
const [thousandSeparator, decimalSeparator] = getLocaleSeparators()
let [wholePart, fractionPart] = numberString.replace(new RegExp(thousandSeparator, 'g'), '').split(decimalSeparator)
wholePart = wholePart || "0"
fractionPart = fractionPart || "0"
console.log(`Whole: ${wholePart}, Fraction: ${fractionPart}`);
}

function getLocaleSeparators() {
const testNumber = 1000.1.toLocaleString()
return [testNumber.substring(1,2), testNumber.substring(5,6)]
}
function splitFloatString(number) {
const numberString = number.toString()
const [thousandSeparator, decimalSeparator] = getLocaleSeparators()
let [wholePart, fractionPart] = numberString.replace(new RegExp(thousandSeparator, 'g'), '').split(decimalSeparator)
wholePart = wholePart || "0"
fractionPart = fractionPart || "0"
console.log(`Whole: ${wholePart}, Fraction: ${fractionPart}`);
}
splitFloatString("123456789123456699999887788812340786.45678907656912574321115194123123456789");
splitFloatString("1,234,567,891,234,566,999,998,888,812,340.456520754186789075194123123456789");
splitFloatString("200")
splitFloatString("0.")
splitFloatString(123456.2349999)
splitFloatString("")

我建议您使用math.floor函数来实现此类目的。

它将作为参数传递的数字向下舍入到其最接近的整数:

此外,Math.ceil()函数将数字向上舍入到下一个最大的整数或整数。

有关其他方便的选项,您可以查看此 https://www.w3docs.com/snippets/javascript/how-to-convert-a-float-number-to-whole-number-in-javascript.html

请尝试这个。 可能会对您有所帮助。

number = "21212.32323";
var numberString = number + ''; // converts into string
var index = numberString.lastIndexOf("."); // get the index
var strFloat, wholeStr;
if(index === -1) {
strFloat = '';
wholeStr = numberString.replace(/[^ws]/gi, '').replace(/ /g,'')
} else {
strFloat = numberString.substring(index + 1); // get the decimal part
var strWhole = numberString.substring(0, index); // get the number
wholeStr = strWhole.replace(/[^ws]/gi, '').replace(/ /g,'') // remove spcl character
}
console.log(`Whole: ${wholeStr}, Fraction: ${strFloat}`);

是的,你不能超过 MAX_SAFE_INTEGER 在 javascript 中,即 32 位。 一个数字在不损失精度的情况下可以达到的 JavaScript 最高整数值是多少?

终于能够得到我一直在寻找的最终答案。

感谢大家的帮助和想法:

function numberSplit (NumString) {
var decimalSep  = 1.1.toLocaleString().substring(1,2),  // Get Deciaml Separator
thousandSep = 1e3.toLocaleString().substring(1,2),  // Get Thousand Separator
fraction    = "0",                                  // Default "0"
n = (NumString = (NumString +="").replace(RegExp("\"+thousandSep,"g"),"")).split(decimalSep);
NumString = n[0] ;                              // Get Whole Part
NumString == "" && (NumString = undefined);     // Whole = undefined if empty
n.length  == 2  && (fraction  = n[1]);          // Get Fractional part (only if 1 decimal place)
fraction  == "" && (fraction  = "0");           // Fraction = 0 if empty
console.log("Whole: ("+NumString+"), Fraction: ("+fraction+")")
}

//-----------------------------------------------------------
// Ttests assuming user enters US-EN separators as an example
//-----------------------------------------------------------
numberSplit("123456789123456699999887788812340786.45678907656912574321115194123123456789");
numberSplit("1,234,567,891,234,566,999,998,888,812,340.456520754186789075194123123456789");
numberSplit("200")
numberSplit("0.")
numberSplit(123456.2349999)
numberSplit("1.2.3");           // Fractional part ignored as invalid
numberSplit("")                 // Return undefined
numberSplit()                   // Return undefined
numberSplit(NaN)                // Return NaN
numberSplit(undefined)          // Return undefined

最新更新