2009-10-09 6 views
7

Y a-t-il un moyen simple de s'assurer que, lorsqu'ils sont convertis en chaînes, les nombres approximatifs (c'est-à-dire les numéros avec la tête Real) n'auront pas de "." Je voudrais qu'ils aient seulement le point décimal dans les cas où il y a réellement une partie décimale affichée.Suppression d'un "." dans la sortie numérique de Mathematica

Les solutions que j'ai trouvé ne sont pas robustes, et dépendent de l'utilisation Precision et Accuracy ensemble NumberForm de façon maladroite, ou à l'aide RealDigits d'une manière encore plus maladroite.

Merci d'avance.

Répondre

5

Je l'ai utilisé dans le passé lors de l'affichage des nombres en chiffres:

Integerise[x_] := If[Round[x] == x, ToString[[email protected]] <> ".0", [email protected]] 

supprimer Juste <> ".0" si vous ne voulez pas que les entiers soient affichés avec un zéro décimal.

Mise à jour: Comme mentionné par dreeves dans le commentaire, ToString tronque encore un certain nombre 0,0001 ou alors d'un entier et afficher le point.

Une meilleure façon d'enlever le point de fuite est d'utiliser le format Inputform pour ToString:

NormalNumber[x_] := ToString[x, InputForm] 

avec un test:

NormalNumber /@ {5, 5.5, 123.001, 123.0001} 

Cela pourrait être incorporé dans Integerise ci-dessus pour résoudre le problème c'est noté.

+1

Je viens de l'essayer et j'ai trouvé qu'il casse pour Integerise [123.0001] (il renvoie une chaîne se terminant par un "."). – dreeves

1

Je ne ferais probablement que post-traiter la chaîne. Il est plus rapide (et plus facile) de vérifier si le dernier caractère est "." que de faire de l'arithmétique redondante et de prendre en compte tous les paramètres de précision.

Edit: peut-être vous le savez, mais vous pouvez faire quelque chose comme ceci:

userToString[expr_, form___] := ToString[expr,form]; 

userToString[expr_Real, form___] := removeTrailingDot[ToString[expr,form]]; 
3

Je recommande ceci:

shownum[x_] := StringReplace[[email protected][x, ExponentFunction->(Null&)], 
          RegularExpression["\\.$"]->""] 

Il juste une recherche regex & remplacer sur la fuite "". Si vous voulez "123" pour afficher "123.0" au lieu de "123", remplacez simplement cette dernière chaîne vide par ".0".

MISE À JOUR: Ma version originale affichait mal pour les nombres que Mathematica affiche par défaut en notation scientifique. J'ai corrigé cela avec NumberForm.

Voici la version que j'utilise réellement dans la vraie vie. Il permet l'arrondi en option:

(* Show Number. Convert to string w/ no trailing dot. Round to the nearest r. *) 
Unprotect[Round]; Round[x_,0] := x; Protect[Round]; 
re = RegularExpression; 
shn[x_, r_:0] := StringReplace[ 
    [email protected][Round[[email protected],r], ExponentFunction->(Null&)], [email protected]"\\.$"->""] 
+0

Cela joue le rôle de removeTrailingDot dans ma réponse. Aussi, bien que je sois bien sûr un grand fan de regex, il est plus rapide d'effectuer une manipulation directe de chaînes - vérifiez le dernier caractère et laissez tomber s'il est ".". La regex est plus rapide à personnaliser, bien sûr, et peut-être que la vitesse n'est pas un problème - mais ce type de fonction peut être appelé à plusieurs reprises. (Vous pouvez également compiler la fonction - ne pas savoir sur le dessus de ma tête si cela fonctionne avec regex) – Cascabel

1

Les fonctions NumberForm, ScientificForm, EngineeringForm, etc ... offre la possibilité NumberFormat pour formater et organiser la mantisse, la base et l'exposant d'un nombre. Avec

numberTrim[expr_] := NumberForm[expr, 
    NumberFormat -> (Row[{StringTrim[#1, "."], 
     If[#3 == "", "", "\[ThinSpace]\[Times]\[ThinSpace]" <> #2^#3]}] &)]; 

la sortie Mathematica par défaut est reproduite, mais le point de fin est supprimé.

Questions connexes