wolfram tutorial research online mathematica gratis graficar full español descargar cost comprar wolfram-mathematica

wolfram mathematica - tutorial - ¿Sprintf equivalente en Mathematica?



wolfram mathematica tutorial (5)

Estoy de acuerdo con Pillsy. Así es como lo haría. Tenga en cuenta la práctica función de cat , que creo que es como sprintf (sin los marcadores de posición que proporciona StringForm), ya que funciona como Imprimir (puede imprimir cualquier concatenación de expresiones sin convertir a String) pero genera una cadena en lugar de enviar a stdout

cat = StringJoin@@(ToString/@{##})&; pad[x_, n_] := If[StringLength@cat[x]>=n, cat[x], cat@@PadLeft[Characters@cat[x],n,"0"]] cat["filename_", pad[#, 5]]&

Esto se parece mucho a la respuesta de Pillsy, pero creo que cat hace un poco más limpio. Además, creo que es más seguro tener ese condicional en la función de relleno: es mejor tener el relleno incorrecto que el número incorrecto.

No sé por qué Wikipedia enumera Mathematica como un lenguaje de programación con printf . Simplemente no pude encontrar el equivalente en Mathematica.

Mi tarea específica es procesar una lista de archivos de datos con números rellenados, que solía hacer en bash con

fn=$(printf "filename_%05d" $n)

La función más cercana que encontré en Mathematica es PaddedForm . Y después de un poco de prueba y error, lo conseguí con

"filename_" <> PaddedForm[ Round@#, 4, NumberPadding -> {"0", ""} ]&

Es muy extraño que tenga que usar el número 4 para obtener el resultado similar al que obtengo de "% 05d". No entiendo este comportamiento en absoluto. ¿Alguien puede explicar me lo?

¿Y es la mejor manera de lograr lo que solía hacer en bash?


Me he encontrado con el mismo problema bastante y he decidido codificar mi propia función. No lo hice en Java, sino que solo usé operaciones de cadena en Mathematica. Resultó bastante largo, ya que en realidad también necesitaba la funcionalidad% f, pero funciona, y ahora lo tengo como un paquete que puedo usar en cualquier momento. Aquí hay un enlace al proyecto GitHub:

https://github.com/vlsd/MathPrintF

Viene con instrucciones de instalación (en realidad, simplemente copiando el directorio en algún lugar de $ Path).

Espero que esto sea de ayuda para al menos algunos.


No usaría PaddedForm para esto. De hecho, no estoy seguro de que PaddedForm sea ​​bueno para casi nada. En su lugar, usaría las viejas ToString antiguas ToString , Characters y PadLeft , así:

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

Luego puede usar StringForm y ToString para hacer su nombre de archivo:

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

Mathematica no se adapta bien a este tipo de munging de cuerdas.

EDITAR para agregar: Mathematica adecuada no tiene la funcionalidad requerida, pero la clase java.lang.String tiene el format() método estático format() que toma argumentos de estilo printf . Puede llamarlo usando la funcionalidad JLink de Mathematica con bastante facilidad. El rendimiento no será muy bueno, pero para muchos casos de uso simplemente no le importará mucho:

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}]]

Necesita hacer un poco más de trabajo, porque JLink es un poco tonto acerca de las funciones de Java con un número variable de argumentos. El método format() toma una cadena de formato y una matriz de Object Java, y Mathematica no hará la conversión automáticamente, que es para lo que está MakeJavaObject .


También puede definir una función que pase todos los argumentos a StringForm [] y usar IntegerString o las funciones de relleno como se mencionó anteriormente:

Sprintf[args__] := StringForm[args__] // ToString; file = Sprintf["filename_``", IntegerString[n, 10, 5]];


IntegerString hace exactamente lo que necesitas. En este caso sería

IntegerString[x,10,5]