2009-10-09 13 views
7

Esiste un modo semplice per garantire che, una volta convertiti in stringhe, i numeri approssimativi (ad esempio, i numeri con la testa Real) non presentino un trattino "."? Mi piacerebbe se dovessero avere solo il punto decimale nei casi in cui effettivamente c'è una parte frazionaria visualizzata.Soppressione di un trattino "." in uscita numerica da Mathematica

Le soluzioni che ho trovato non sono robusti, e dipendono utilizzando Precision e Accuracy insieme NumberForm in modo scorretto, o utilizzando RealDigits in modo ancora più scomodo.

Grazie in anticipo.

risposta

5

Ho usato questo in passato, quando la visualizzazione dei numeri in cifre:

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

Basta togliere <> ".0" se non vuoi che gli interi siano visualizzati con un decimale a zero.

Aggiornamento: Come accennato dal dreeves nel commento, ToString sarà ancora troncare una serie all'interno di 0,0001 o così di un intero e visualizzare il punto.

Un modo migliore per rimuovere il punto finale è quello di utilizzare il formato Inputform per ToString:

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

con un test:

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

Questo potrebbe essere incorporato in Integerise sopra per risolvere il problema notato.

+1

Ho appena provato questo e ho scoperto che si interrompe per Integerise [123.0001] (restituisce una stringa che termina con un "." Finale). – dreeves

1

Probabilmente avrei appena post-elaborato la stringa. È più veloce (e molto più semplice) controllare se l'ultimo carattere è "." che fare aritmetica ridondante e prendere in considerazione tutte le impostazioni di precisione.

Edit: forse lo sai, ma si può fare qualcosa di simile:

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

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

Consiglio questo:

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

E 'solo che una ricerca regex & sostituire sul finale "". Se vuoi "123". per visualizzare come "123.0" anziché "123", basta sostituire la stringa vuota finale con ".0".

AGGIORNAMENTO: La mia versione originale visualizzata erroneamente per i numeri che Mathematica per impostazione predefinita visualizza in notazione scientifica. L'ho risolto con NumberForm.

Ecco la versione che effettivamente utilizzo nella vita reale. Permette di arrotondamento opzionale:

(* 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

Questo svolge il ruolo di removeTrailingDot nella mia risposta. Inoltre, anche se ovviamente sono un grande fan della regex, è più veloce eseguire la manipolazione diretta delle stringhe: controlla l'ultimo carattere e rilasciatelo se è ".". La regex è più veloce da personalizzare, ovviamente, e forse la velocità non è un problema, ma questo tipo di funzione può essere richiamato ripetutamente molto. (Si potrebbe anche compilare la funzione - non so in cima alla mia testa se questo funziona con regex) – Cascabel

1

Le funzioni NumberForm, ScientificForm, EngineeringForm, ecc ... offre la possibilità NumberFormat per formattare e organizzare la mantissa, base ed esponente di un numero. Con

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

l'output Mathematica predefinito viene riprodotto, ma il punto finale viene rimosso.

Problemi correlati