将 "Floating Point Number String" 拆分为整数和小数部分的最安全方法是什么

What is the safest way to split a "Floating Point Number String" into its Whole and Fractional Parts

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

注1:整数部分可以运行变成大数(超过50位)

注2:输出结果(整数和分数字符串)不会被转换为整数或浮点数,只会作为字符串进一步操作,因为Javascript 大数舍入。所以回到数字在这里不是问题

因为该函数会自动检测机器的区域设置,因此预计用户在其本地机器的区域设置中输入(传递)号码,否则会生成号码以编程方式传递给函数。

由于长度非常大,而且没有对以指数 (e) 格式传递的数字进行处理,因此该数字应作为 "string" 传递。

该函数使用 toLocaleString() 检测小数点和千位分隔符。

我已经使用主要数字系统 (.,' space) 测试了该功能,到目前为止一切顺利。

问题是,这段代码的安全性如何,是否有更好、更安全的替代方法或corrections/changes必要的方法?

谢谢

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

请试试这个。可能会帮助你。

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(/[^\w\s]/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(/[^\w\s]/gi, '').replace(/ /g,'') // remove spcl character
}

console.log(`Whole: ${wholeStr}, Fraction: ${strFloat}`);

是的,您不能在 javascript 中超过 MAX_SAFE_INTEGER,即 32 位。 What is JavaScript's highest integer value that a number can go to without losing precision?

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

感谢大家的帮助和想法:

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

我建议您为此目的使用 math.floor 函数。

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

另外,Math.ceil() 函数将数字四舍五入到下一个最大的整数或整数。

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