这是一个简单的场景。我想在我的网站上显示两个值的减法:
//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
谁能告诉我我做错了什么?
答案 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
表示删除所有逗号。
答案 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()
或扩展它以适应您需要的确切数字表示。