Разногласия хороши, Вам не нужен одиночный элемент. Неудачно, что одна из худших привычек дизайна выйти из повального увлечения шаблонов является также одним из обычно принятый. Я обвиняю неудачное появление простоты, но я отступаю. Если бы они назвали его "Статическим Глобальным" шаблоном, я уверен, что люди были бы более робкими об использовании его.
я предлагаю использовать класс обертки с частным статическим экземпляром класса, который Вы хотите использовать для одиночного элемента. Вы не представите трудную пару всюду по своему коду как Вы, будет с одиночным элементом.
Некоторые люди называют это шаблоном моносостояния. Я склонен думать о нем как просто другое скручивание на понятии стратегии/агента, так как можно допускать больше гибкости путем реализации различных интерфейсов для представления/скрытия функциональности.
Я использовал это в прошлом при отображении чисел в цифрах:
Integerise[x_] := If[Round[x] == x, ToString[Round@x] <> ".0", ToString@x]
Просто удалите <> ".0"
, если вы не хотите, чтобы целые числа были отображается с нулевым десятичным числом.
Обновление: Как упоминалось dreeves в комментарии, ToString
по-прежнему будет усекать число в пределах 0,0001 или около того от целого числа и отображать точку.
A лучший способ удалить конечную точку - использовать формат Inputform
для ToString:
NormalNumber[x_] := ToString[x, InputForm]
с тестом:
NormalNumber /@ {5, 5.5, 123.001, 123.0001}
Это может быть включено в Integerise
выше, чтобы исправить отмеченную проблему .
Я рекомендую следующее:
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@"\\.$"->""]
Я бы, вероятно, просто обработал строку постобработкой. Быстрее (и намного проще) просто проверить, является ли последний символ "." чем выполнять избыточную арифметику и учитывать все настройки точности.
Изменить: возможно, вы это знаете, но вы можете сделать что-то вроде этого:
userToString[expr_, form___] := ToString[expr,form];
userToString[expr_Real, form___] := removeTrailingDot[ToString[expr,form]];