2009-10-09 30 views
7

有沒有一些簡單的方法可以確保當轉換爲字符串時,近似數字(即帶有Real頭的數字)不會有尾隨「。」?如果在實際上有顯示的小數部分的情況下他們只有小數點,我希望它。抑制尾隨「。」在Mathematica的數值輸出中

我已經找到了解決方案,是不穩健,並依賴於一個尷尬的方式使用PrecisionAccuracy一起NumberForm,或者在一個更加尷尬的方式使用RealDigits

在此先感謝。

回答

5

我已經在過去的數字顯示數字時使用此:

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

只是刪除<> ".0"如果不希望整數以十進制數顯示。

更新:正如dreeves在評論中提到的,ToString仍然會截斷整數的0.0001左右的數字並顯示該點。

一種更好的方式,以除去尾隨點是使用Inputform格式的ToString:與測試

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

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

這可以被併入到Integerise以上來解決這個問題指出。

+1

我剛剛試過這個,發現它打破了Integerise [123.0001](它返回一個以尾隨「。」結尾的字符串)。 – dreeves 2009-10-14 22:37:51

1

我可能只是後處理字符串。檢查最後一個字符是否是「。」會更快(並且更容易)。比做冗餘算術並考慮到所有精度設置。

編輯:也許你知道這一點,但你可以做這樣的事情:

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

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

我建議這樣的:

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

它只是一個正則表達式搜索&在後代替 「」。如果你想要「123」。顯示爲「123.0」而不是「123」,則只需用「.0」替換最後一個空字符串。

更新:我的原始版本顯示錯誤的數字,默認情況下Mathematica以科學記數法顯示。 我用NumberForm修復了這個問題。

下面是我在現實生活中實際使用的版本。它允許可選的舍入:

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

這在我的答案中扮演着removeTrailingDot的角色。另外,雖然我當然是一個正則表達式的粉絲,但是直接進行字符串操作會更快 - 檢查最後一個字符,如果它是「。」,就放棄它。當然,正則表達式的定製速度更快,也許速度不是問題 - 但這種功能可能會被重複調用很多。 (你也可以編譯這個函數 - 如果這個函數和regex一起工作的話,不要知道我的頭頂) – Cascabel 2009-10-15 06:36:43

1

功能NumberForm,​​,EngineeringForm ...等提供了選項NumberFormat格式化,並安排數的尾數,基地和指數。隨着

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

默認的Mathematica輸出轉載,但後點被刪除。