0 votos

AppleScript : separar el número del texto en una variable

Tengo un script que calcula el plazo entre la fecha y devuelve el resultado en días o meses o años.

Por ejemplo, dado miResultado = "6 Días" ¿Cómo puedo separar el número del texto?

Me las arreglé para conseguir el número sólo usando este :

set myResultNumberOnly to number of myResult

pero no consigo hacer lo mismo a partir del texto :

set myResultTextOnly to text of myResult

También probé

set myResultTextOnly to word of myResult

¿Tal vez pueda ir con la delimitación de texto? No puedo saber la longitud del número usando este :

set theLength to (get length of (myResultTextNumberOnly as text))

¿O debería utilizar la declaración if?

¿Cuál sería la mejor manera de hacerlo?

ACTUALIZACIÓN

Me acabo de dar cuenta de que set myResultNumberOnly to number of MyResult dar un número equivocado, realmente no entiendo por qué ?

set MyResult to "Account Value:$478.01"
set myResultNumberOnly to number of MyResult

Resultado: 21

1voto

qarma Puntos 71

number of MyResult obtiene la longitud de una cadena. "6 days" sólo tiene 6 caracteres, mientras que "Account Value:$478.01" tiene 21 caracteres.

El método más sencillo para extraer números de una cadena sería dividir la cadena en palabras y, a continuación, probar cada elemento de la lista individualmente para ver si se puede convertir en un número:

set MyResult to "Account Value:$478.01"
set MyResultWords to words of MyResult

repeat with w in MyResultWords
    set w's contents to coerceToNumber(w's contents)
end repeat

set MyResultNumbers to every number in MyResultWords

to coerceToNumber(x)
    local x

    try
        x as number
    on error
        x
    end try
end coerceToNumber

Esto no manejará las representaciones de cadenas de números en notación científica, por ejemplo 1.234E+09 ya que el método que utiliza AppleScript para delimitar sus palabras da como resultado {"1.234E", "+", "09"} . En este caso, puede establecer text item delimiters a space y realizar la misma operación en el text items of My Result .

Tengo un script que calcula el plazo entre la fecha y devuelve el resultado en días o meses o años.

Sin embargo, me pregunto por qué tu script está produciendo un resultado que es un valor de cadena de "6 días". Me hace creer que el script que estás usando para calcular los intervalos de tiempo entre fechas no lo está haciendo de la manera más amigable posible. En parte, esto depende de la entrada que recibe tu script, pero en muchos casos, deberías considerar la posibilidad de convertir la entrada en objetos de fecha de AppleScript, que entonces te permite calcular las diferencias fácilmente y te devuelve un número real que puedes manipular para adquirir una medida en días, minutos, horas, etc.

El ejemplo script de abajo asume una cadena de fecha con formato ISO 8601 como entrada, es decir. "yyyy-mm-dd" aunque se podría adaptar el script para atender a otros formatos de entrada:

# The units parameter is optional, and defaults to measurements in seconds.
# To choose a different unit, pass one of the constants 'hours', 'days',
# 'minutes', or 'weeks' (without quotes).
on timeInterval from startDate to endDate by units : 1
    tell (current date) to set [startDate, ¬
        day, [year, its month, day]] to ¬
        [it, 1, words of startDate]

    tell (current date) to set [endDate, ¬
        day, [year, its month, day]] to ¬
        [it, 1, words of endDate]

    (endDate - startDate) / units
end timeInterval

timeInterval from "2012-06-03" to "2019-04-01" by days    --> 2493.0
timeInterval from "2012-06-03" to "2019-04-01" by weeks   --> 356.142857142857
timeInterval from "2019-03-31" to "2019-04-01" by hours   --> 24.0
timeInterval from "2019-03-31" to "2019-04-01" by minutes --> 1440.0
timeInterval from "2019-03-31" to "2019-04-01"            --> 8.6E+4 [ = 86400 ]

0 votos

Bonito script, mucho mejor que mi actual script de acuerdo, ¡gracias!

1 votos

Como dije en la descripción, el formato de entrada debe ser una cadena de fecha con formato ISO 8601, es decir, con el formato "yyyy-mm-dd" . current date devuelve un objeto de fecha AppleScript, y "19/05/2019" no está en el "yyyy-mm-dd" formato. Es mejor escribir un segundo manejador para convertir las fechas de "dd/mm/yyyy" a "yyyy-mm-dd" que se puede hacer con words of... y no text item delimiters es decir set ISOdate to {word 3, word 2, word 1} of MyDate .

0 votos

Lo he convertido de esta manera y funciona bien: establecer MiFecha a la cadena de fecha corta de (fecha actual) establecer [dayVal, MonthVal, YearVal] a las palabras de MiFecha decirle a (fecha actual) que establezca MiFecha a dayVal & "-" & MonthVal & "-" & YearVal

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X