Sprintf, эквивалентный в Mathematica?

Для показа примера того, что описывали другие:

SELECT
    Col1, -- All of the columns you want to dedupe on
    Col2, -- which is not neccesarily all of the columns
    Col3, -- in the table
    Col4,
    Col5,
    Col6,
    Col7,
    Col8,
    Col9,
    Col10
FROM
    MyTable
GROUP BY
    Col1,
    Col2,
    Col3,
    Col4,
    Col5,
    Col6,
    Col7,
    Col8,
    Col9,
    Col10
HAVING
    COUNT(*) > 1
26
задан jxy 6 October 2009 в 16:18
поделиться

2 ответа

Я бы не стал использовать для этого PaddedForm . На самом деле, я не уверен, что PaddedForm годится для чего-либо. Вместо этого я бы использовал старый добрый ToString , Символы и PadLeft , например:

toFixedWidth[n_Integer, width_Integer] := 
  StringJoin[PadLeft[Characters[ToString[n]], width, "0"]]

Затем вы можете использовать StringForm и ToString для создания имени файла:

toNumberedFileName[n_Integer] :=
  ToString@StringForm["filename_``", toFixedWidth[n, 5]]

Mathematica не очень хорошо подходит для такого рода перестановки строк.

ИЗМЕНИТЬ, чтобы добавить: Собственно Mathematica не имеет необходимой функциональности, но класс java.lang.String имеет статический метод format () , который принимает аргументы в стиле printf . Вы можете легко вызвать его, используя функциональность JLink в системе Mathematica. Спектакль будет не очень, но для многих случаев использования вам это будет безразлично:

Needs["JLink`"];
LoadJavaClass["java.lang.String"];
LoadJavaClass["java.util.Locale"];
sprintf[fmt_, args___] :=
 String`format[Locale`ENGLISH,fmt,
  MakeJavaObject /@
   Replace[{args},
    {x_?NumericQ :> N@x,
     x : (_Real | _Integer | True | 
         False | _String | _?JavaObjectQ) :> x,
     x_ :> MakeJavaExpr[x]},
    {1}]]

Вам нужно проделать немного больше работы, потому что JLink немного тупит в отношении функций Java с переменным числом аргументов. Метод format () принимает строку формата и массив объектов Java Object , и Mathematica не будет выполнять преобразование автоматически, что и является тем, что MakeJavaObject есть для.

9
ответ дан 28 November 2019 в 17:16
поделиться

Я согласен с Пилси. Вот как я бы сделал это. сделайте это. Обратите внимание на удобную функцию cat , которую я считаю чем-то вроде sprintf (без заполнителей, таких как StringForm), поскольку она работает как Print (вы можете распечатать любое объединение выражений без преобразования в String), но генерирует строку вместо отправки в стандартный вывод.

cat = StringJoin@@(ToString/@{##})&;

pad[x_, n_] := If[StringLength@cat[x]>=n, cat[x], 
                                          cat@@PadLeft[Characters@cat[x],n,"0"]]

cat["filename_", pad[#, 5]]&

Это очень похоже на ответ Пилси, но я думаю, что cat делает его немного чище. Кроме того, я думаю, что безопаснее иметь это условие в функции pad - лучше иметь заполнение неправильное, чем неправильное число.

1
ответ дан 28 November 2019 в 17:16
поделиться