Подавление трейлинга "." в числовом выходе из Mathematica - PullRequest
7 голосов
/ 10 октября 2009

Есть ли какой-нибудь простой способ обеспечить, чтобы при преобразовании в строки приблизительные числа (т. Е. Числа с заголовком Real) не имели завершающего символа "."? Мне бы хотелось, чтобы они имели десятичную точку только в тех случаях, когда на самом деле отображается дробная часть.

Решения, которые я нашел, не надежны и зависят от использования Precision и Accuracy вместе NumberForm неуклюжим образом или от использования RealDigits еще более неуклюже.

Заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 10 октября 2009

Я использовал это в прошлом при отображении чисел на цифрах:

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

Просто удалите <> ".0", если не хотите, чтобы целые числа отображались с нулевым десятичным знаком.

Обновление: Как упомянуто Дривсом в комментарии, ToString все равно будет усекать число в пределах 0,0001 или около того целого числа и отображать точку.

Лучший способ удалить конечную точку - использовать формат Inputform для ToString:

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

с тестом:

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

Это может быть включено в Integerise выше, чтобы исправить отмеченную проблему.

3 голосов
/ 15 октября 2009

Я рекомендую это:

shownum[x_] := StringReplace[ToString@NumberForm[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[
  ToString@NumberForm[Round[N@x,r], ExponentFunction->(Null&)], re@"\\.$"->""]
1 голос
/ 14 марта 2016

Функции NumberForm, ScientificForm, EngineeringForm и т. Д. ... предлагают опцию NumberFormat для форматирования и упорядочения мантиссы, базы и показателя степени числа. С

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

воспроизводится вывод Mathematica по умолчанию, но конечная точка удаляется.

1 голос
/ 10 октября 2009

Я бы, вероятно, просто обработал строку. Это быстрее (и намного проще) просто проверить, является ли последний символ "." чем делать избыточную арифметику и учитывать все настройки точности.

Редактировать: возможно, вы знаете это, но вы можете сделать что-то вроде этого:

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

userToString[expr_Real, form___] := removeTrailingDot[ToString[expr,form]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...