代码之家  ›  专栏  ›  技术社区  ›  Mohsen Alyafei

将“浮点数字符串”拆分为整数和小数部分最安全的方法是什么

  •  0
  • Mohsen Alyafei  · 技术社区  · 6 年前

    进入它的 整个 分数的

    注1:数字的整个部分可以变成大数字(超过50位)。

    注2:输出结果(整数和分数字符串)不会转换为整数或浮点,但由于Javascript对大数进行舍入,因此只能作为字符串进行进一步操作。所以回到数字上来不是一个问题

    用户在本地机器的区域设置中输入(传递)号码 否则,数字将以编程方式生成并传递给函数。

    由于长度非常大,而且没有处理以指数(e)格式传递的数字,因此该数字应作为“字符串”传递。

    函数使用toLocalString()来检测十进制和千位分隔符。

    问题是, 这个密码有多安全 ,是否有其他更好更安全的方法或必要的纠正/更改?

    谢谢

     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()
    0 回复  |  直到 6 年前
        1
  •  2
  •   rishichawda    6 年前

    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("")
        2
  •  1
  •   Bùi Đức Khánh    6 年前

    我建议你使用 math.floor

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

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

    https://www.w3docs.com/snippets/javascript/how-to-convert-a-float-number-to-whole-number-in-javascript.html

        3
  •  0
  •   sibabrat swain    6 年前

    请试试这个。也许对你有帮助。

    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\u SAFE\u整数,即32位。 What is JavaScript's highest integer value that a number can go to without losing precision?

        4
  •  0
  •   Mohsen Alyafei    6 年前

    感谢所有人的帮助和想法:

    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