2010-03-09 14 views
1

J'ai une chaîne java qui a une valeur en dollars et en cents après les points décimaux et en commençant par un signe + ou -. Je veux convertir en cents et le stocker dans un entier (il peut avoir + ou -). Je dois aussi vérifier si la partie cents (après la virgule) pas plus de 2 chiffres et lancer un message d'erreur si existeEn ce qui concerne la conversion Java dollar en cents

exemple: chaîne dollval = « 12,23 » valeur de sortie = 1223 cents

Chaîne dollval = "12" valeur de sortie = 1200 cents

chaîne dollval = "-0,09" valeur de sortie = -9 cents

chaîne dollval = "" -99" valeur de sortie = -99 cents

chaîne dollval = "-99.0" valeur de sortie e = -99 cents

chaîne dollval = "-99,23" valeur de sortie = -9923 cents

chaîne dollval = "0,00" valeur de sortie = 0 cents

chaîne dollval = "5.2" sortie val = 520 cents

chaîne dollval = "5.20" valeur de sortie = 520 cents

+0

a également oublié de mentionner dans mon précédent post. quand je traite la valeur comme "-0.09" signe est perdu quand je suis passé à l'entier en dollars. dollar a une valeur 0 et 9 cents a – Arav

+2

@arav: Vous pouvez modifier vos propres questions pour clarifier les choses, aussi. – trashgod

Répondre

0

Il est un bon problème de devoirs. Essayez tokenizing (ou scission) sur la décimale. Le premier jeton vous donnera tous vos dollars. La deuxième partie, les pennies. Si seulement 1 caractère après la décimale, multipliez par 10 de sorte que 12.3 devient 12 * 100 + 3 * 10, pas seulement 3. Si plus de 2 jetons, erreur.

Vous pouvez également faire (int) Float.parseFloat (string) * 100, mais vous pourriez avoir des problèmes d'arrondi. Mieux vaut rester dans des terres entières.

1

Il existe encore des problèmes majeurs avec vos exemples.

Chaîne dollval = valeur de sortie "12" = 1200 cents

chaîne dollval = "-99" valeur de sortie = -99 cents

Donc, si un nombre est positif, il est dollars, et si c'est négatif c'est des centimes? C'est illogique.

chaîne dollval = "-99,0" valeur de sortie = -99 cents

chaîne dollval = "-99,23" valeur de sortie = -9923 cents

Que signifient les chiffres après la ». ' signifie réellement? Dans le premier exemple, ils semblent signifier une fraction fractionnaire d'un cent. Dans la seconde, ils signifient une fraction de dollar. C'est illogique.


Cela dit, je mettre en œuvre cette aide d'un regex pour diviser l'entrée en parties, convertir les parties en entiers puis les réassembler en fonction du sens inféré des exemples. Quelque chose comme ceci:

int cents; 
Matcher m = Pattern.compile("([-+]?)([0-9]+)(?:\.([0-9]{0,2}))").matcher(input); 
if (m.matches()) { 
    int sign = m.group(0).equals("-") ? -1 : 1; 
    cents = Integer.parseInt(m.group(1)); 
    if (m.groupCount() == 3) { 
     // I'm assuming that "99.1" should mean 9910 cents ... 
     int tmp = (m.group(2).length() == 0) ? 0 : 
       (m.group(2).length() == 1) ? (Integer.parseInt(m.group(2)) * 10) : 
       Integer.parseInt(m.group(2)); 
     cents = cents * 100 + tmp; 
    } 
    cents = cents * sign; 
} else { 
    throw new SomeException("invalid dollars/cents value"); 
} 

Avertissement: ce code peut même pas compiler, encore moins fonctionner comme prévu.Et bien sûr, la mise en œuvre dépend de certains aspects des exigences ... que je pense toujours faux.

+0

Merci beaucoup pour votre temps. J'ai manqué le type d'entrée ci-dessous par l'utilisateur. Merci beaucoup pour me faire savoir « Bien que vous pouvez définir « 99 » signifie 99 cents et « 99,0 » signifie 9900 cents, qui est susceptible de dérouter les utilisateurs » si l'utilisateur entre « 99,1 » ou « 99,10 » il devrait être 9910 cents. Il y avait aussi une faute de frappe dans la sortie que j'ai posté plus tôt. Je suis en train de l'éditer maintenant – Arav

4

Je ferais certainement pas cela avec regexps, car cela conduit à un code inutilement complexe et sujet aux erreurs. L'API Java standard offre une solution beaucoup plus simple:

BigDecimal dollars = new BigDecimal(inputString); 
    if(dollars.scale()>2) 
    { 
     throw new IllegalArgumentException(); 
    } 
    int cents = dollars.multiply(new BigDecimal(100)).intValue(); 

Notez cependant que vos exigences ci-dessus ne sont pas compatibles:

Chaîne dollval = valeur de sortie "12" = 1200 cents

Chaîne dollval = "" -99 "valeur de sortie = -99 cents

Mon code suppose qu'il s'agit d'une erreur et que vous vouliez dire des nombres sans partie fractionnaire à inter Preted comme dollars pleins pour les nombres positifs aussi bien que négatifs.

+0

La complexité ajoutée ajoutée est l'ajout de la maintenance. Un ingénieur avec qui j'ai travaillé une fois l'a très bien résumé. Une conception n'est pas terminée quand vous ne pouvez pas en ajouter plus d'un design est fini quand vous ne pouvez rien enlever. Réduisez-le à l'essentiel pour le rendre aussi solide et robuste que possible. Plutôt une application d'écran vert qui fonctionne de manière cohérente qu'une interface graphique fantaisie qui l'écrase ma devise. Yip à l'ancienne, il pourrait être mais au moins cela garantit la livraison. – Namphibian