2017-10-16 2 views
1

Je suis en train d'écrire un programme de calcul de base et j'implémente des décimales. En essayant de concevoir un moyen d'ajouter une décimale à un opérande, je viens au problème de la duplication décimale.Ajouter une décimale à une chaîne si une décimale n'apparaît pas entre la fin de chaîne et les caractères spécifiés

"5.5.5" // shouldn't be possible, ignore second . addition 
"5.5 + 5.5" or "5 + 5.5" // wonderful! 

J'ai un code comme ceci:

String expression = ""; 
... 
//various methods to append numbers, operators, etc to string 
... 
addDecimal() { 
    if (expression.equals("")) { 
     expression += "0."; // if no operand, assume it's 0-point-something 
    } else { 
     if(/* some condition */) { 
      expression += "."; 
      //note it is appending a decimal to the end of the expression 
      //ie at the end of the rightmost operand 
     } 
    } 
} 

Les opérateurs sont +, -, *, /. Une description plus déclarative de ce que j'essaie de faire est:

check string if it contains a decimal 
    if not, addDecimal() 
    if so, split string by operators above, look at the rightmost operand; does it contain a decimal? 
     if not, addDecimal() 
     if so, do nothing 

par exemple.

expression = "2"; 
addDecimal(); //expression is now "2." 
//append decimal to only operand 

expression = "5.5 + 4"; 
addDecimal(); //expression is now "5.5 + 4." 
//append a decimal to rightmost operand 

expression = "7.5"; 
addDecimal(); //expression is now "7.5" 
//if an operand contains a decimal already, it cannot have another 

expression = "2 + 5"; 
addDecimal(); //expression is now "2 + 5." 
//note the decimal was only appended to the rightmost operand 
//ignoring the leftmost operand 

La règle est congruent qu'une décimale est seulement ajouté à l'opérande extrême droite, pas à tous les opérandes dans l'expression.

+0

Votre approche semble discutable. Je voudrais réviser les entités que vous utilisez dans votre architecture. Par exemple, je n'ai pas tendance à considérer "5.5 + 4." une expression. Je voudrais d'abord construire un nombre sans respect pour "expression", puis l'insérer dans l '"expression" –

+0

@ AlexeyR.as c'est une calculatrice, il est fait dans les étapes (touches). On peut supposer qu'une personne va entrer un autre nombre après une décimale, ou je considérerais un "4". pour signifier "4.0" comme je l'ai fait avec "." devenant "0". – gator

+0

Je vois. Désolé, il n'était pas très clair quelle était l'entrée supposée. Ensuite, il peut être logique d'implémenter une sorte de machine d'état qui est alimentée par un symbole et prend une décision en fonction de l'état dans lequel il se trouve actuellement. –

Répondre

0

Vous pouvez utiliser cette base lookaround regex pour le remplacement:

str = str.replaceAll("(?<!\\.)\\b\\d+\\b(?!\\.)(?!.*\\d)", "$0."); 

RegEx Demo

RegEx Breakup:

  • (?<!\\.): VALOIR nous n'avons pas de point à la position précédente
  • \\b\\d+\\b: Faire correspondre un ou plusieurs chiffres avec les limites des mots
  • (?!\\.): Affirmez nous n'avons pas de point avant
  • (?!.*\d): Assurez-vous que nous sommes le droit le plus opérande
+0

Que diriez-vous de "2 + 5"? Cela donne "2. + 5". lorsque prévu serait "2 + 5". – gator

+0

Si l'on s'attend à ce que '5.5 + 4' devienne' 5.5 + 4.' (les deux décimales) alors pourquoi '2 + 5' ne devrait pas devenir' 2. + 5.'? – anubhava

+0

Peut-être qu'une décimale est seulement désirée d'être ajoutée au 5, pas au 2? Tous les opérandes n'ont pas besoin d'une décimale. – gator

-1

Vous pouvez utiliser String.split.

par exemple.

String[] splitExpression = expression.split("."); 
if(splitExpression.length > 2){ 
    expression = splitExpression[0] + "." + splitExpression[1]; 
} 
else { 
    // Either a valid decimal or no decimal number at all 
}