replaceAll e strings currencyFormat

Boa tarde pessoal!
Estou com problemas no replaceAll, deêm uma olhada:

double valor=13.0;
NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();
String valorformatado = currencyFormat.format(valor);
thisLine = thisLine.replaceAll("##price_per_edition##", valorformatado);

Quando tento para o Locale Holandês funciona mas quando mudo o Locale para brasileiro por exemplo dá o seguinte erro:

java.lang.IllegalArgumentException: Illegal group reference

OBS.: O formato holandês fica com o simbolo do euro e o brasileiro R$

Alguma idéia?

Obrigada!! :slight_smile:

Voce sabe que replaceAll usa expressoes regulares, ne? O “illegal group reference” que ele te da vem disso. Qual o conteudo de thisLine a esse ponto?

Oi,

Tive um problema parecido com esse e encontrei um código num desses fóruns java, não lembro qual, que resolveu meu problema. O código esta logo abaixo. Tenta utilizar ele como modelo.

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.util.Locale;

/** 
 * Classe que padroniza a internacionalizacao de valores monetarios 
 * @author Luiz Cavalcanti 
 * @version 0.1 
 * @see java.util.Locale 
 * @see java.text.DecimalFormat 
 * @see java.text.DecimalFormatSymbols 
 */ 
public final class Ver { 
    
    /** 
     * Simbolos especificos do Dolar Americano 
     */ 
    private static final DecimalFormatSymbols DOLAR = new DecimalFormatSymbols(Locale.US); 
    /** 
     * Mascara de dinheiro para Dolar Americano 
     */ 
    public static final DecimalFormat DINHEIRO_DOLAR = new DecimalFormat("¤ ###,###,##0.00",DOLAR); 
    /** 
     * Simbolos especificos do Euro 
     */ 
    private static final DecimalFormatSymbols EURO = new DecimalFormatSymbols(Locale.GERMANY); 
    /** 
     * Mascara de dinheiro para Euro 
     */ 
    public static final DecimalFormat DINHEIRO_EURO = new DecimalFormat("¤ ###0.00",EURO); 
    /** 
     * Locale Brasileiro 
     */ 
    private static final Locale BRAZIL = new Locale("pt","BR"); 
    /** 
     * S�mbolos especificos do Real Brasileiro 
     */ 
    private static final DecimalFormatSymbols REAL = new DecimalFormatSymbols(BRAZIL); 
    /** 
     * Mascara de dinheiro para Real Brasileiro 
     */ 
    public static final DecimalFormat DINHEIRO_REAL = new DecimalFormat("###,###,##0.00",REAL); 
    
    /** 
     * Mascara texto com formatacao monetaria 
     * @param valor Valor a ser mascarado 
     * @param moeda Padrao monetario a ser usado 
     * @return Valor mascarado de acordo com o padrao especificado 
     */ 
    public static String mascaraDinheiro(double valor, DecimalFormat moeda){ 
        return moeda.format(valor); 
    } 
	
}

De repente vc não precise nem utilizar o replaceAll.

Ats.,

Daniel Pedra Branca

no replaceAll o conteúdo é:
R$ 13,00 para locale brasileiro
ou
€ 13,00 para locale holandês
Estou precisando usar o replaceAll porque estou substituindo todas as “##price_per_edition##” pelo valor encontrado.
Como poderia fazer para o replaceAll ignorar os simbolos € e R$?

Obrigada.

O que o CV está lhe querendo dizer é que o símbolo do real (R$) contém um caracter que é “mágico” para o replaceAll (que requer uma expressão regular, não uma string “fixa”).
Com o euro você teve sorte, já que não tem um “caracter mágico”. Mas com o real você vai ter problemas.

Se você estiver usando Java 5.0, use Pattern.quote() para transformar “R$” em “R\$” - pôr um “” antes do $ tira o caráter “mágico” do “$”, transformando-o em um caracter normal.
Se não estiver usando Java 5.0, você pode trocar o “$” por “\$” na mão, usando algo parecido com:

String simbolo = "R$"; // (ou então US$,  € etc.)
simbolo = simbolo.replaceAll ("\$", "\$"); // veja a documentação e me explique porque funciona ;-)