Javascript parse float忽略了逗号后的小数

时间:2011-09-27 15:17:20

标签: javascript parsefloat

这是一个简单的场景。我想在我的网站上显示两个值的减法:

//Value on my websites HTML is: "75,00"
var fullcost = parseFloat($("#fullcost").text()); 

//Value on my websites HTML is: "0,03"
var auctioncost = parseFloat($("#auctioncost").text());

alert(fullcost); //Outputs: 75
alert(auctioncost); //Ouputs: 0

谁能告诉我我做错了什么?

12 个答案:

答案 0 :(得分:116)

这是“按设计”。 parseFloat函数只会考虑字符串的各个部分,直到达到非+, - ,数字,指数或小数点。一旦它看到逗号就会停止查看,只考虑“75”部分。

要解决此问题,请将逗号转换为小数点。

var fullcost = parseFloat($("#fullcost").text().replace(',', '.'));

答案 1 :(得分:23)

javascript的parseFloat不接受locale参数。因此,您必须将,替换为.

parseFloat('0,04'.replace(/,/, '.')); // 0.04

答案 2 :(得分:16)

parseFloat根据JavaScript definition of a decimal literal进行解析,而不是您的语言环境定义。 (例如,parseFloat不支持语言环境。)JavaScript中的十进制文字使用.作为小数点。

答案 3 :(得分:14)

为什么不使用globalize?这只是您不使用英语时可以遇到的问题之一:

Globalize.parseFloat('0,04'); // 0.04

stackoverflow上的一些链接可以查看:

答案 4 :(得分:10)

@JaredPar在his answer中指出使用parseFloat替换

var fullcost = parseFloat($("#fullcost").text().replace(',', '.'));

只需将comma替换为dot即可解决,除非这是一个超过千人的数字,如1.000.000,00这样会给你错误的数字。因此,您需要替换comma删除dots

// Remove all dot's. Replace the comma.
var fullcost = parseFloat($("#fullcost").text().replace(/\./g,'').replace(',', '.'));

通过使用两次替换,您将能够处理数据而不会在输出中收到错误的数字。

答案 5 :(得分:5)

JS中的数字使用.(句号/句号)字符来表示小数点不是,(逗号)。

答案 6 :(得分:4)

最好使用此语法替换百万分之1,234,567的所有逗号

var string = "1,234,567";
string = string.replace(/[^\d\.\-]/g, ""); 
var number = parseFloat(string);
console.log(number)

g表示删除所有逗号。

检查Jsfiddle demo here

答案 7 :(得分:1)

对于任何到达这里的人,想知道如何处理可能涉及逗号(,)和句号(.)的问题,但是可能不知道确切的数字格式-这就是我的方式在使用parseFloat()之前更正字符串(从其他答案中借用想法):

function preformatFloat(float){
   if(!float){
      return '';
   };

   //Index of first comma
   const posC = float.indexOf(',');

   if(posC === -1){
      //No commas found, treat as float
      return float;
   };

   //Index of first full stop
   const posFS = float.indexOf('.');

   if(posFS === -1){
      //Uses commas and not full stops - swap them (e.g. 1,23 --> 1.23)
      return float.replace(/\,/g, '.');
   };

   //Uses both commas and full stops - ensure correct order and remove 1000s separators
   return ((posC < posFS) ? (float.replace(/\,/g,'')) : (float.replace(/\./g,'').replace(',', '.')));
};
// <-- parseFloat(preformatFloat('5.200,75'))
// --> 5200.75

至少,这将允许解析英式/美式和欧洲十进制格式(假设字符串包含有效数字)。

答案 8 :(得分:0)

对于我来说,我已经有句号(.)和逗号(,),所以对我有用的是用空字符串replace逗号(,)如下所示:

parseFloat('3,000.78'.replace(',', '')) 

这是假设现有数据库中的金额为3,000.78。结果为:3000.78,但不带逗号(,)

答案 9 :(得分:-1)

在我的原籍国,货币格式为“ 3.050,89€”

parseFloat将点标识为小数点分隔符,要添加2个值,我们可以这样输入:

parseFloat(element.toString().replace(/\./g,'').replace(',', '.'))

答案 10 :(得分:-1)

如果您不知道用户区域设置,您可以使用带有分隔符规范化的函数:

import org.mapstruct.*;

@Mapper
@Named("QualifierPetMapper")
public interface PetMapper {
    @Named("DelegatingPetMapper")
    @BeanMapping(ignoreByDefault = true)
    default PetTarget mapPet(PetSource petSource) {
        switch (petSource.getPetType()) {
            case "DOG":
                DogTarget dogTarget = mapDog(petSource);
                updatePet(dogTarget, petSource);
                return (dogTarget);

            case "CAT":
                CatTarget catTarget = mapCat(petSource);
                updatePet(catTarget, petSource);
                return (catTarget);

            default:
                throw new CustomException("Unsupported Pet type: "+ petSource.getPetType());

        }
    }

    @BeanMapping(ignoreByDefault = true)
    // Specific mappings for Dog
    @Mapping(target = "dogfood.name", source = "dogfoodName")
    DogTarget mapDog(PetSource petSource);

    @BeanMapping(ignoreByDefault = true)
    // Specific mappings for Cat
    @Mapping(target = "fish.name", source = "favoriteFish")
    CatTarget mapCat(PetSource petSource);

    @Named("RootPetMapper")
    @BeanMapping(ignoreByDefault = true)
    // Common properties for Pet
    @Mapping(target = "weight.value", source = "weightValue")
    @Mapping(target = "name.value", source = "petName")
    @Mapping(target = "color", source = "mainColor")
    void updatePet(@MappingTarget PetTarget petTarget, PetSource petSource);
}

示例:

function toFloat(value) {
  const delimiterRegex = /[0-9,\.]*([,\.])[0-9]*/;
  const delim = input.match(delimiterRegex);
  if(delim){
    if (delim[1] == ','){
      input = input.replace('.', '').replace(',','.');
    }
    else if (delim[1] == '.'){
      input = input.replace(',', '');
    }
  }
    return parseFloat(input);
}

let input = '123,346.3'
console.log(toFloat(input))

答案 11 :(得分:-1)

您做错的是向 parseFloat() 提供以面向人类的符号表示小数的字符串,而 parseFloat() 仅接受与 JavaScript 数字文字对应的标准格式,与区域无关,始终使用点作为小数点分隔符,并且没有千位分隔符。

此外,在所有答案中使用的这个 parseFloat() 函数在接受正确输入方面过于慷慨:

Input      Result
'1Hello'   1
'1 and 2'  1
'1.2+3.4'  1.2
' 25  '    25
''         NaN
'hey'      NaN

为了获得更严格并因此更好控制的行为,我建议您实现自己的解析功能。这是我的:

// Parse a decimal fraction in standard notation:
// ['+'|'-']digit{digit}[<decsep>digit{digit}]
// Returns the parsed number or undefiend in case of incorrect input.
function /* number */ parse_float( /* string */ s, /* string */ decsep )
{   var /* integer */ whole, frac ; // whole and fractinal parts
    var /* integer */ wnext, fnext; // position of next char after parse
    var /* integer */ fraclen     ; // length of fractional part
    var /* integer */ ofs         ; // offset of the first digit
    var /* boolean */ done        ; // entire string scanned?
    var /* integer */ sign        ; // sign of result
    var /* number  */ res         ; // result
        /* labels  */ end: { whole: {
    
    frac    = 0;
    fraclen = 0;
    res     = NaN;
    ofs     = 1;
    sign    = 1;
    switch( s.charAt(0) )
    {   case '-': sign = -1; /* fall-through */
        case '+':            break;
        default : ofs = 0;   break;
    }

    if( !decsep )                                               break end;
    if( decsep.length !== 1 )                                   break end;
    if( [done, wnext, whole] = parse_int( s, ofs ), done      ) break whole;
    if( wnext - ofs === 0                                     ) break end  ;
    if( s.charAt( wnext ) !== decsep                          ) break end  ;
    if( [done, fnext, frac] = parse_int( s, wnext + 1), !done ) break end  ;
    fraclen = fnext - wnext - 1;
    if( fraclen === 0)                                          break end  ;

    } /* whole: */ res = ( whole + frac / Math.pow( 10, fraclen ) ) * sign;
    } /* end:   */ return res;
}

// Parse a compact of digits beginning at position `start' in string `s'
//as an integer number.
function
// boolean full -- entire string was scanned
// integer next -- index of next character to scan
// integer res  -- result
parse_int( /* string */ s, /* int */ start )
{   const /* integer */ ASCII_0 = 48;

    var /* boolean   */ full; // \
    var /* integer   */ next; //  > the return value
    var /* integer   */ res ; // /
    var /* integer   */ n, i; // string length and current position
    var /* integer   */ code; // character code

    n    = s.length;
    full = true;
    next = n;
    res  = 0;
    for( i = start; i < n; i += 1 )
    {   code = s.charCodeAt(i);
        if( code < ASCII_0 || code >= ASCII_0 + 10 )
        {   next = i;
            full = false;
            break;
        }
        res = res * 10 + code - ASCII_0;
    }
    if( code === undefined ) res = NaN;
    return [ full, next, res ];
}

使用 parse_float() 调用 decsep=',' 的一些示例:

Input     Result
''         NaN
'1a'       NaN
'1,'       NaN
'1 '       NaN
'1'        1
'12,34'   12.34
'+12,34'  12.34
'-12,34' -12.34

您可以使用此函数代替 parseFloat() 或扩展它以适应您需要的确切数字表示。