Mudar separador decimal no sprintf.

Caros, Como posso mudar o separador decimal no sprintf()? No output do R eu consigo mudar com o options(), mas não afeta o sprintf. Perguntando no StacoOverflow, me sugeriram trocar o LC_NUMERIC ( http://stackoverflow.com/questions/23586741/change-decimal-character-in-spri...), mas o que funciona para a pessoa que sugeriu não funcionou para mim. Alguma sugestão?

Você não pode fazer um gsub() depois? Algum CMR? À disposição. Walmes.

Walmes, Segue CMR já respondendo o porque não posso fazer gsub no final: sprintf("Matricula: %s \n Peso: %2.2f", '123.4', 47.5) 2014-05-12 1:19 GMT-03:00 walmes . <walmeszeviani@gmail.com>:
Você não pode fazer um gsub() depois? Algum CMR?
À disposição. Walmes.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Não ficou claro porque você não pode usar o gsub(). Eu tentei mudando o locale e deu certo para mim. Veja: x <- sprintf("Matricula: %s \n Peso: %2.2f", '123.4', 47.5) x ## Qualquer ponto por vírgula. gsub("\\.", ",", x) ## Ponto entre números por vírgula. gsub("(\\d)\\.(\\d)", "\\1,\\2", x) ## Sys.getlocale() Sys.setlocale("LC_NUMERIC","*pt_BR.utf8*") sprintf("Matricula: %s \n Peso: %2.2f", '123.4', 47.5) À disposição. Walmes.

Não da para trocar no gsub() pq nem todo ponto vai virar virgula. Outro exemplo seria um CPF no lugar da matricula, ou até mesmo um texto maior. Quanto ao LC_NUMERIC, deu o seguinte erro aqui:
## Sys.getlocale() Sys.setlocale("LC_NUMERIC","pt_BR.utf8") [1] "" Mensagens de aviso perdidas: 1: In Sys.setlocale("LC_NUMERIC", "pt_BR.utf8") : espeficação de 'LC_NUMERIC' pode fazer o R funcionar de forma estranha 2: In Sys.setlocale("LC_NUMERIC", "pt_BR.utf8") : SO informa que a requisição para definir o locale como 'pt_BR.utf8' não pode ser honrada
2014-05-12 10:08 GMT-03:00 walmes . <walmeszeviani@gmail.com>:
Não ficou claro porque você não pode usar o gsub(). Eu tentei mudando o locale e deu certo para mim. Veja:
x <- sprintf("Matricula: %s \n Peso: %2.2f", '123.4', 47.5) x
## Qualquer ponto por vírgula. gsub("\\.", ",", x)
## Ponto entre números por vírgula. gsub("(\\d)\\.(\\d)", "\\1,\\2", x)
## Sys.getlocale() Sys.setlocale("LC_NUMERIC","*pt_BR.utf8*")
sprintf("Matricula: %s \n Peso: %2.2f", '123.4', 47.5) À disposição. Walmes.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Existe uma distinção entre mensagens de **erro** e mensagens de **aviso**. Apesar dessas mensagens de **aviso**, a alteração no locale produziu os resultados esperados para mim.
x <- sprintf("Matricula: %s \n Peso: %2.2f", '123.4', 47.5) x [1] "Matricula: 123.4 \n Peso:* 47.50*"
## Sys.getlocale() Sys.setlocale("LC_NUMERIC","pt_BR.utf8") [1] "pt_BR.utf8" Mensagens de *aviso* perdidas: In Sys.setlocale("LC_NUMERIC", "pt_BR.utf8") : espeficação de 'LC_NUMERIC' pode fazer o R funcionar de forma estranha sprintf("Matricula: %s \n Peso: %2.2f", '123.4', 47.5) [1] "Matricula: 123.4 \n Peso: *47,50*"
À disposição. Walmes.

Mas por alguma razão eu não consigo mudar o locale para esse (o 2o warning, que não aparece para ti). A pessoa que postou no SO também conseguiu resolver, mas eu também não consegui mudar para o locale sugerido por ele... Provavelmente deve ser porque estou no Windows 2014-05-12 14:21 GMT-03:00 walmes . <walmeszeviani@gmail.com>:
Existe uma distinção entre mensagens de **erro** e mensagens de **aviso**. Apesar dessas mensagens de **aviso**, a alteração no locale produziu os resultados esperados para mim.
x <- sprintf("Matricula: %s \n Peso: %2.2f", '123.4', 47.5) x [1] "Matricula: 123.4 \n Peso:* 47.50*"
## Sys.getlocale() Sys.setlocale("LC_NUMERIC","pt_BR.utf8")
[1] "pt_BR.utf8" Mensagens de *aviso* perdidas:
In Sys.setlocale("LC_NUMERIC", "pt_BR.utf8") : espeficação de 'LC_NUMERIC' pode fazer o R funcionar de forma estranha
sprintf("Matricula: %s \n Peso: %2.2f", '123.4', 47.5) [1] "Matricula: 123.4 \n Peso: *47,50*"
À disposição. Walmes.
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Senhores, boa tarde! O problema de mudar o local realmente tem a ver com o Sistema Operacional. Pelo que entendi do artigo indicado a seguir, no Windows só há uma codepage válida pra cada linguagem. No caso do português é a codepage 1252. No linux é possível trocar a codepage pra linguagem, p. ex. pra utf-8 ou ISO-8859-1. Mais detalhes no artigo: http://withr.me/blog/2013/11/15/configure-character-encoding-for-r-under-lin... Como paliativo sugiro intermediar com formatC(). Segue exemplo: ### <code r> val <- formatC(1247.51, format='f', decimal.mark=',', big.mark = ".", digits=2) sprintf("Matricula: %s \n Peso: %s", '123.4', val) ### </code> O comando formatC() entende os números corretamente e pode evitar os problemas anteriormente citados com uso de gsub(). Éder Comunello <c <comunello.eder@gmail.com>omunello.eder@gmail.com> Dourados, MS - [22 16.5'S, 54 49'W]

Também pode funcionar a combinação de paste()/paste0() com format()/formatC(), no lugar de sprintf(). Éder Comunello <c <comunello.eder@gmail.com>omunello.eder@gmail.com> Dourados, MS - [22 16.5'S, 54 49'W]
participantes (3)
-
Rodrigo Coster
-
walmes .
-
Éder Comunello