¿Crea una etiqueta formateada como “1,000 '” desde el campo numérico?

9

Esta pregunta se basa en una pregunta anterior que encontré en gis.stackexchange: ¿Cómo editar fácilmente los datos de atributos usando Expresiones regulares?

¿Quizás alguien pueda señalarme en la dirección correcta?

Tengo un archivo de formas vectoriales de líneas de contorno. En la tabla de atributos, ya he convertido un campo llamado PIES que consta de datos enteros que contienen valores de elevación a un campo de cadena llamado Etiqueta. Además, agregué con éxito un 'al final de la cadena para que cuando los datos estén etiquetados se lean como pies.

Lo siguiente que intento hacer es insertar una coma entre los dos primeros valores de la cadena solo si la longitud de la cadena es mayor que 4, o para que una coma solo aparezca entre los miles y cientos de dígitos en el campo Etiqueta. La longitud debe ser mayor que 4 porque también estoy contando el '

Mi código hasta ahora es:

case when  length( "Label") >4  then regexp_replace( "Label", '^([0-9])+([0-9]{3}\')$','$1 , $2') else "Label" end

sin embargo, la función regexp_replace no parece aceptar las variables de grupo $ 1 $ 2 en el tercer parámetro de la función.

He visto http://docs.python.org/2/library/re.html ya que la expresión regular de la calculadora de campo es de lo que entiendo basado en el uso de expresiones regulares de Python, pero no he podido resolver esto. Quizás lo que intento hacer aún no es posible con esta función en la calculadora de campo en QGIS 1.8 en mac OSX. O lo más probable es que mi sintaxis sea incorrecta, ya que soy un programador novato y algo nuevo en las expresiones regulares.

Clhenrick
fuente
¿Tiene que estar codificado? ¿No sería una manera simple de (en Excel o similar) crear una nueva columna que tuviera la etiqueta formateada como deseaba? Todo lo que tendría que usar es un comando de concatenación.
Andrew Tice
Sí, esa sería una forma de resolver el problema, sin embargo, estoy tratando de resolverlo desde QGIS o con Python.
clhenrick
@chrishenrick: ¿mi respuesta lo resolvió por ti?
Stev_k
@Stev_k aún no ha tenido tiempo de probarlo, lo hará pronto y te lo haré saber. ¡Gracias por tu ayuda!
clhenrick

Respuestas:

8

El uso de dos funciones de cadena en la calculadora QGIS en la versión 2.6 Mac OS XI fue capaz de lograr esto. Aquí están los pasos:

  1. Con la calculadora de campo, cree un nuevo campo que sea un tipo de cadena con un ancho relevante.

  2. Ejecute la siguiente expresión para establecer el valor del campo:
    concat( format_number( "Field_name" , 0) , '\'')

Esto creó una columna con una cadena formateada como quería, por ejemplo, el número 2000se formateará 2,000'con el final 'que significa pies.

Clhenrick
fuente
6

QGIS ha creado una función llamada format_numberpara abordar esto. Simplemente lo haces format_number(12345,0)para llegar 12,345.

Minh Mai
fuente
Esas son buenas noticias. Aunque parte de mi pregunta implica agregar 'a al final del número para representar "pies". ¿Sería capaz de hacer lo siguiente en QGIS con esta función? format_number(12345,0) + "'"
clhenrick
Creo que la respuesta sería concat(tostring(format_number(12345,0)), "'"). Primero tendría que convertir el número formateado en una cadena usando la tostringfunción y luego usar la concatfunción para adjuntar el 'al final.
Minh Mai
Tiene sentido, esto es lo que he publicado en mi respuesta anterior y trabajé:concat( format_number( "Field_name" , 0) , '\'')
clhenrick
3

Puede agrupar dígitos fácilmente en Python. Aquí hay una función que he usado, que creo que encontré en StackOverflow:

def digitgroup(n, sep = ','):
    if n == "": n = 0
    s = str(n)[::-1]
    groups = []
    i = 0
    while i < len(s):
        groups.append(s[i:i+3])
        i += 3
    return sep.join(groups)[::-1]
dmahr
fuente
gracias por la sugerencia, dmahr. Sin embargo, no tengo claro cómo implementar esta función en QGIS. Intenté cortar y pegar esta función en la expresión de la calculadora de campo y establecer n en el nombre de mi campo, pero sin suerte. ¿Hay alguna manera de implementar scripts de Python en QGIS fuera de la calculadora de campo?
clhenrick
3

Para las personas cuya configuración regional no se ajusta a la pantalla de formato deseada, format_numberno es una solución adecuada. Por ejemplo, en mi sistema francés, format_number(2000)siempre se muestra 2 000(con un espacio como separador de miles) independientemente de la configuración del idioma QGIS, aunque a veces necesito una pantalla de "estilo inglés", por ejemplo. 2,000.

En tales casos, el siguiente enfoque (y algo engorroso) funciona (al menos en QGIS 2.18):

if (your_field > 1000,
  concat(
    floor(your_field/1000),
    ',',
    your_field-1000*floor(your_field/1000)
  ),
  your_field
)

Por supuesto, puede reemplazarlo ','con el separador de miles que desee. Tenga en cuenta que esta expresión solo funciona con números inferiores a 1,000,000.

ArMoraer
fuente
2

En QGIS, la función "número_formato" bajo el menú de cadena en la calculadora de campo reformatea números para ubicar separadores específicos y lugares decimales.

Forkandwait
fuente
mira mi comentario en la respuesta de Minh Mai.
clhenrick
1

Es un poco más complicado que eso en QGis. Según este artículo , debe crear su propia definición de función en Python, luego importarla a QGis (esto se puede hacer automáticamente al inicio). Esto puede parecer complicado, ¡pero solo necesitas hacerlo una vez y siempre estará ahí!

Esta es la función que utilicé, basada en dmahr de arriba. No estoy seguro de cómo se trata con las cadenas, ya que modifiqué un poco el código.

from qgis.utils import qgsfunction
from qgis.core import QGis

@qgsfunction(2, "Python") # number of arguments
def thousands_separator(values, feature, parent): # values are the arguments passed in
    # this is the documentation for your function which you will see in QGis
    """
    Adds a separator to values over 1000\n        
    Parameters: (n, sep) \n                   
    n = expression_field \n
    sep = desired separator (default is ",")
    """ 
    number = values[0]                        # the first argument (which in the
    separator = values[1]                     # labelling case is a field name
    if separator == '':
        separator = ','
    s = str(number)[::-1]
    groups = []
    i = 0
    while i < len(s):
        groups.append(s[i:i+3])
        i += 3
    return separator.join(groups)[::-1]

Luego guarda eso en .qgis / python, importa el archivo a QGis usando la consola, luego aparecerá en las funciones "Python" en la herramienta de etiquetas.

La expresión que utilicé es: miles_coma ("[field_name]", ',')

Stev_k
fuente
Además, no vi qué versión estaba usando, debe actualizar a 2.0 para que esto funcione
Stev_k
hola, gracias y perdón por la respuesta tardía. Estoy en v2.6 Mac OS X 10.9.5 ¿Dónde coloco exactamente el archivo de Python? Supongo que en algún lugar /Applications/QGIS.app/Contents/Resources/python/?
clhenrick
Vea mi respuesta a continuación para una solución mucho más simple. Sin embargo, no sé qué versión se necesita para que funcione.
forkandwait