2009-10-09 14 views
7

Czy istnieje prosty sposób na zapewnienie, że po konwersji na ciągi, przybliżone liczby (tj. liczby z głowicą Real) nie będą miały końcowego znaku "."? Chciałbym, aby miały one tylko separator dziesiętny w przypadkach, w których faktycznie wyświetlana jest część ułamkowa.Pomijanie końcowego "." w liczbowym wyjściu z Mathematica

rozwiązania, jakie stwierdzono, że nie są wytrzymałe i zależą pomocą Precision i Accuracy razem NumberForm w niewygodnej sposób lub za pomocą RealDigits w sposób jeszcze bardziej niewygodne.

Z góry dziękuję.

Odpowiedz

5

wcześniej używanych w przeszłości podczas wyświetlania cyfr w liczbach:

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

Wystarczy usunąć <> ".0" jeśli nie chcesz, aby liczby całkowite były wyświetlane z zerową wartością dziesiętną.

Update: Jak wspomniano dreeves w komentarzu ToString nadal obcina liczbę 0,0001 lub tak liczbą całkowitą i wyświetlić punkt.

Lepszym sposobem, aby usunąć kropkę jest użycie formatu na Inputform dla ToString:

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

z testu:

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

To może być włączona do Integerise powyżej, aby rozwiązać problem znakomity.

+1

Po prostu próbowałem tego i odkryłem, że łamie dla Integerise [123.0001] (zwraca ciąg kończący się z końcowym "."). – dreeves

1

Prawdopodobnie po prostu przetworzę ciąg znaków. To szybsze (i łatwiejsze) sprawdzenie, czy ostatnia postać to "." niż robić zbędną arytmetykę i brać pod uwagę wszystkie ustawienia precyzji.

Edycja: być może wiesz, ale można zrobić coś takiego:

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

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

Polecam:

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

To po prostu nie szukaj regex & wymienić na tylnym "". Jeśli chcesz "123." aby wyświetlić jako "123.0" zamiast "123", po prostu zastąp ten końcowy pusty ciąg ".0".

AKTUALIZACJA: Moja oryginalna wersja była wyświetlana nieprawidłowo w przypadku liczb, które program Mathematica domyślnie wyświetla w notacji naukowej. Naprawiłem to za pomocą NumberForm.

Oto wersja, której naprawdę używam w prawdziwym życiu. Pozwala on na opcjonalnym zaokrąglenia:

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

Odgrywa to rolę removeTrailingDot w mojej odpowiedzi. Ponadto, choć oczywiście jestem wielkim fanem regex, szybsze jest wykonywanie bezpośredniej manipulacji ciągami - sprawdź ostatnią postać i upuść ją, jeśli jest ".". Oczywiście, regex jest szybszy w dostosowywaniu i prawdopodobnie prędkość nie jest problemem - ale tego rodzaju funkcję można wielokrotnie wywoływać. (Można również skompilować funkcję - nie wiem z góry mojej głowy, jeśli to działa z regex) – Cascabel

1

Funkcje NumberForm, ScientificForm, EngineeringForm itd ... oferuje opcję NumberFormat formatowania i zorganizować mantysy, podstawę i wykładnik liczby. Z domyślnym wyjściem Mathematica jest reprodukowane domyślne wyjście Mathematica, ale końcowa kropka jest usuwana.