2014-04-29 8 views
1

La valeur numérique négative que je reçois de l'application principale est formatée conformément à notre configuration interne (profil utilisateur de l'interface utilisateur). En d'autres termes, pour la valeur -23.79879 mon entrée xml peut être <myNumber>-23.79879</myNumber> ou <myNumber>23,79879-</myNumber> ou autre
et je ne peux pas désactiver le formatage.
L'hypothèse est que les formats sont "standard", normalement utilisés pour la localisation.
Je cherche à faire quelque chose comme:Conversion de la chaîne en nombre flottant négatif en Javascript

convertStringToNumber(numberString, formatString, slignPosition) 
+1

Les nombres auront-ils un séparateur de milliers ainsi qu'un séparateur décimal? Par exemple, pourrait-il y avoir '-2,123.79879' (', '= séparateur de milliers) ou' -2.123,79879' ('.' = séparateur de milliers)? S'ils le peuvent, alors vous devrez faire une supposition si seulement un des symboles (',' ou '.') est présent et se trouve être dans un emplacement valide pour l'un ou l'autre (comme' 1,234', qui pourrait être "un et 234 cent" ou "mille deux cent trente-quatre"). –

+2

Vous * avez * envoyé un rapport de bogue aux fournisseurs de l'application principale, n'est-ce pas? :-) Les API doivent envoyer des données dans un format cohérent et sans ambiguïté. Les formulaires localisés sont destinés aux utilisateurs et non aux logiciels. –

+1

J'ai définitivement classé un bug, mais il y a très peu de chances qu'il soit corrigé prochainement :-( – user3010912

Répondre

1

Je ne sais pas ce que vous entendez avec formatString, mais peut-être quelque chose comme ça ?:

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

La meilleure façon d'y parvenir est d'exposer la la règle d'analyse du backend, qui connaît évidemment le format. Cela peut être fait de plusieurs façons, mais un moyen facile dont je raffole est simplement de décomposer toutes les parties mobiles du format, de définir les propriétés de chacun sur un objet, puis d'exposer cet objet à l'analyseur.

L'objet pourrait ressembler à ceci:

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

passe ensuite cet objet en fonction d'analyse syntaxique comme ceci:

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; 
} 

Vous appelleriez alors comme thuis:

parseNumber (opt, '2,345,234-'); //-2345.234

Questions connexes