2014-04-29 48 views
1

我从后端应用程序获取的负数值根据我们的内部配置(UI用户配置文件)进行格式化。换句话说,对于值-23.79879我的xml输入可能是 <myNumber>-23.79879</myNumber><myNumber>23,79879-</myNumber>或其他
,我无法关闭格式。
假设是格式是“标准”,通常用于本地化。
我希望做类似:将字符串转换为Javascript中的负浮点数

convertStringToNumber(numberString, formatString, slignPosition) 
+1

数字是否有千位分隔符和小数点分隔符?例如,是否可以有'-2,123.79879'(','=千分之一分隔符)或者“-2.123,79879”('.' =千分之一分隔符)?如果可以的话,那么如果只有一个符号(','或'.')存在并恰好处于有效位置(例如'1,234',这可能是“一,二百三十四个”或“一千二百三十四”)。 –

+2

您*已*向后端应用程序的供应商提交错误报告,对不对? :-) API应以明确,一致的格式发送数据。本地化的表格供用户使用,而不是软件。 –

+1

我明确提出了一个错误,但很少有机会很快修复:-( – user3010912

回答

1

不知道你的意思formatString的是什么,但也许这样的事情?:

function convertStringToNumber(num){ 
    num=num.split(',').join('.'); 
    if(num.indexOf('-') ==num.length-1){ 
     num='-'+num.substr(0,num.length-1); 
    } 
    return parseFloat(num) || null; 
} 



console.log(convertStringToNumber("-23.79879")) 
console.log(convertStringToNumber("23,79879-")) 
1

实现这一目标最简单的方法是揭露从后端解析规则,显然知道格式。这可以通过很多方式完成,但我喜欢的一种简单方法是简单地分解格式的所有移动部分,为每个对象定义属性,然后将该对象暴露给解析器。

的对象可以是这个样子:

var opts = { 
    thousandsSeparator: ',', 
    decimalSeparator: '.', 
    negativeSign: '-' 
}; 

然后将该对象传递到解析函数是这样的:

function parseNumber(opts, str) { 
     var isNegative = false; 
     if(str.indexOf(opts.negativeSign) != -1) { 
      isNegative = true; 
      str = str.replace(opts.negativeSign,''); 
     } 
     var parts = str.split(opts.thousandsSeparator).join('').split(opts.decimalSeparator); 
     var num = 1 * parts[0]; 
     var deci = 1 * parts[1]; 
     if(deci) num += deci/Math.pow(10,parts[1].length); 
     return isNegative ? -1 * num : num; 
} 

你可以这样调用它的Thuis:

parseNumber (选择采用, '2,345.234-'); //2345.234

相关问题