2009-10-09 36 views
7

Có cách nào đơn giản để đảm bảo rằng, khi được chuyển đổi thành chuỗi, số gần đúng (tức là, số có đầu số Real) sẽ không có dấu "."? Tôi muốn nó nếu họ chỉ có dấu thập phân trong trường hợp thực sự có phần phân đoạn được hiển thị.Loại bỏ dấu "." Trong một số đầu ra từ Mathematica

Các giải pháp tôi đã tìm thấy không phải là mạnh mẽ, và phụ thuộc vào việc sử dụng PrecisionAccuracy cùng NumberForm một cách vụng về, hoặc sử dụng RealDigits một cách thật vụng về.

Xin cảm ơn trước.

Trả lời

5

Tôi đã sử dụng này trong quá khứ khi hiển thị số trong con số:

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

Chỉ cần loại bỏ <> ".0" nếu bạn không muốn số nguyên được hiển thị với số thập phân bằng 0.

Cập nhật: Như đã đề cập bởi các chú thích trong nhận xét, ToString sẽ vẫn cắt ngắn một số trong khoảng 0,0001 hoặc hơn số nguyên và hiển thị dấu chấm.

Cách tốt hơn để loại bỏ các dấu chấm là sử dụng định dạng Inputform cho ToString:

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

với một thử nghiệm:

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

Điều này có thể được đưa vào Integerise ở trên để sửa chữa vấn đề lưu ý.

+1

Tôi vừa thử điều này và thấy rằng nó bị hỏng cho Integerise [123.0001] (nó trả về một chuỗi kết thúc bằng dấu "."). – dreeves

1

Tôi có thể chỉ cần xử lý chuỗi. Nó nhanh hơn (và dễ dàng hơn) để kiểm tra xem ký tự cuối cùng có phải là "." hơn là làm số học dư thừa và tính đến tất cả các cài đặt chính xác.

Edit: có lẽ bạn biết điều này, nhưng bạn có thể làm điều gì đó như thế này:

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

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

Tôi khuyên bạn nên điều này:

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

Nó chỉ không tìm kiếm regex & thay vào dấu "". Nếu bạn muốn "123". để hiển thị là "123.0" thay vì "123", sau đó chỉ cần thay thế chuỗi trống cuối cùng bằng ".0".

CẬP NHẬT: Phiên bản gốc của tôi hiển thị sai cho các số mà Mathematica theo mặc định hiển thị trong ký pháp khoa học. Tôi đã sửa lỗi đó bằng NumberForm.

Đây là phiên bản tôi thực sự sử dụng trong đời thực. Nó cho phép làm tròn tùy chọn:

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

Điều này đóng vai trò của removeTrailingDot trong câu trả lời của tôi. Ngoài ra, mặc dù tôi là tất nhiên một fan hâm mộ lớn của regex, nó nhanh hơn để làm thao tác chuỗi trực tiếp - kiểm tra các ký tự cuối cùng và thả nó nếu nó ".". Regex là nhanh hơn để tùy chỉnh, tất nhiên, và có lẽ tốc độ không phải là một vấn đề - nhưng loại chức năng có thể nhận được gọi là nhiều lần rất nhiều. (Bạn cũng có thể biên dịch các chức năng - không biết ra khỏi đỉnh đầu của tôi nếu điều đó làm việc với regex) – Cascabel

1

Các chức năng NumberForm, ScientificForm, EngineeringForm, vv ... cung cấp tùy chọn NumberFormat để định dạng và sắp xếp các mantissa, cơ sở và số mũ của một số. Với

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

đầu ra Mathematica mặc định được sao chép, nhưng dấu chấm được xóa.

Các vấn đề liên quan