concretesolutions / canarinho Goto Github PK
View Code? Open in Web Editor NEWUtilitários Android para padrões Brasileiros
License: Apache License 2.0
Utilitários Android para padrões Brasileiros
License: Apache License 2.0
E ai pessoal, estou tentando utilizar a lib, ao add ao projeto,
Após sincronização do gradle, estou tomando o seguinte erro:
Error:(128, 20) Failed to resolve: br.com.concrete:canarinho:2.0.0
Ha um exemplo de configuração utilizando a dependencia?
implementation 'br.com.concrete:canarinho:2.0.0'
java.lang.ArrayIndexOutOfBoundsException: length=51; index=52
at br.com.concretesolutions.canarinho.watcher.BaseCanarinhoTextWatcher.trataRemocaoDeCaracter(BaseCanarinhoTextWatcher.java:139)
at br.com.concretesolutions.canarinho.watcher.BaseCanarinhoTextWatcher.trataAdicaoRemocaoDeCaracter(BaseCanarinhoTextWatcher.java:109)
at br.com.concretesolutions.canarinho.watcher.BoletoBancarioTextWatcher.afterTextChanged(BoletoBancarioTextWatcher.java:67)
at android.widget.TextView.sendAfterTextChanged(TextView.java:8017)
at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:10178)
at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:1043)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:560)
at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:225)
at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:224)
at android.text.method.BaseKeyListener.backspaceOrForwardDelete(BaseKeyListener.java:106)
at android.text.method.BaseKeyListener.backspace(BaseKeyListener.java:51)
at android.text.method.BaseKeyListener.onKeyDown(BaseKeyListener.java:215)
at android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:138)
at android.widget.TextView.doKeyDown(TextView.java:6106)
at android.widget.TextView.onKeyDown(TextView.java:5919)
at android.view.KeyEvent.dispatch(KeyEvent.java:2654)
at android.view.View.dispatchKeyEvent(View.java:9237)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
at android.widget.ScrollView.dispatchKeyEvent(ScrollView.java:379)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640)
at com.android.internal.policy.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2395)
at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1727)
at android.app.Activity.dispatchKeyEvent(Activity.java:2729)
at android.support.v7.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:543)
at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:53)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:315)
at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:53)
at com.android.internal.policy.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2310)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4139)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4101)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3654)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3707)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3673)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3799)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3681)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3856)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3654)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3707)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3673)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3681)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3654)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5969)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5908)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5869)
at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3446)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Atualmente o validador de telefone contempla números com 9 dígito?
Estou utilizando o validador de telefone, entretanto, mesmo o número estando parcialmente incompleto, o callback de ehValido é chamado.
Segue o trecho de código:
appCompatEditTextPhoneSecondary.addTextChangedListener(new MascaraNumericaTextWatcher.Builder() .paraMascara("(##) #####-####") .build())
Para teste, utilize esse número de exemplo: 21980777957
Em cenários de testes unitários com JUnit 4 que utilizem a classe ValidadorCPFCNPJ.java
, a seguinte exceção é disparada:
Caused by: java.lang.RuntimeException: Method clear in android.util.SparseArray not mocked. See http://g.co/androidstudio/not-mocked for details.
at android.util.SparseArray.clear(SparseArray.java)
at br.com.concrete.canarinho.DigitoPara$Builder.trocandoPorSeEncontrar(DigitoPara.java:202)
at br.com.concrete.canarinho.validator.ValidadorCPF.<clinit>(ValidadorCPF.java:18)
... 56 more
Uma solução possível seria alterar na classe DigitoPara.java
na linha 133, conforme abaixo
private final SparseArray<String> substituicoes = new SparseArray<String>();
para
private final SparseArrayCompat<String> substituicoes = new SparseArrayCompat<String>();
Desta forma, poderá ser usada em testes unitários na JVM.
https://developer.android.com/reference/android/support/v4/util/SparseArrayCompat.html
Olhando o código e testando em uma aplicação que criei, percebi que sempre que se usa uma mascara numérica faz-se necessário um Validador e um EventoDeValidacao. Mas algumas vezes a mascara numérica já supre a necessidade ou não é possível fazer uma validação (como por exemplo em uma mascara de campo para identidade, já que a estrutura de identidade pode ser diferente em diferentes estados do Brasil). Então queria questionar a obrigatoriedade de usar um Validador e um EventoDeValidacao.
Alguém poderia me informar se tem como por valores inversos, vou explicar
digitei: 12000
A - 1
B - 12
C - 120
D - 1.200
E - 12.000
Seria interessante quebrar a lib em duas uma somente com os formatadores e verificadores e afins que não precisem depender do android em si, e outra com as funcionalidades usadas no android em si onde ela depende desta outra primeira lib
Lib Android <-------Lib Java
Desta maneira a mesma poderia ser usada no próprio backend alguém precise de alguma validação ou formatar algo
O cpf 123.456.789-09 é dito como inválido pela lib, porem é um cpf válido.
Exemplo de validador no qual o cpf é valido e tem o código aberto aqui
Gostaria de levantar a discussão se vale a pena termos custom views no projeto, por exemplo, para tarefas comuns, como cadastro de endereço ou cartão de crédito.
String input = "R$ 2.800,00";
Formatador formatador = Formatador.VALOR_COM_SIMBOLO;
String desformata = formatador.desformata(input);
Expected:
2800.00
Actual:
2
Causa:
Valor real extraído de forma incorreta no FormatadorValor
A partir de 1° de Maio o JCenter vai para de funcionar. Isso vai impactar builds que usam o Canarinho.
Por favor, publicar as versões do canarinho no Maven Central ou outro lugar.
É muito comum alguns backends devolverem valores monetários em centavos, para evitar o problema com o tipo float
. Seria interessante termos a opção de formatar valores monetários em centavos.
Quando seto na view como o exemplo:
<android.support.design.widget.TextInputEditText
android:id="@+id/amount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_value"
android:inputType="textFilter|number"
android:maxLength="13"
android:text="0,00" />
se manter somente android:inputType="textFilter|number" o simbolo de Real não é visível.
O simbolo somente é visivel se remover o inputType "number" e colocar "text" da seguinte forma:
android:inputType="textFilter|text"
Gostaria de manter o simbolo de Real mas com teclado somente numérico, é possível?
Obrigado
Olá!
Estava usando sua lib em um projeto simples acadêmico e obtive um erro ao usar certos CPFs salvos em tipo Long em um ArrayList. No caso, os CPFs que foram salvos começam em sequências de um ou mais zeros e os tipos numéricos desconsideram Esses zeros no começo da sequência. Quando o sistema se deparou com esses dados no preenchimento de um RecyclerView, obtive
java.lang.IllegalArgumentException: Valor não está formatado propriamente.
Para contornar o problema, coloquei manualmente uma checagem em meu Adapter pra esse campo, mas acho interessante incluir isso na checagem do formatador dentro da própria lib.
A checagem que fiz (de maneira não muito elaborada, claro), adiciona os zeros faltantes no começo do valor antes da formatação, conforme abaixo:
`
if (String.valueOf(clientes.get(position).getCpf()).length() < 11) {
String cpf = String.valueOf(clientes.get(position).getCpf());
int tamanho = cpf.length();
while (tamanho < 11) {
cpf = "0" + cpf;
tamanho++;
}
holder.cpfTextView.setText("CPF: " + Formatador.CPF.formata(cpf));
} else {
holder.cpfTextView.setText("CPF: " + Formatador.CPF.formata(String.valueOf(clientes.get(position).getCpf())));
}
`
Describe the bug
Na API 28, o FORMATADOR_MOEDA
falha com um NPE, aparentemente devido a alguma mudança de comportamento não desejada na implementação de NumberFormat
.
To Reproduce
// Executando no Android P
final String value = "1.000.000,00";
assertEquals("1000000.00", Formatador.VALOR.desformata(value));
Additional context
Bug aberto no issue tracker do Android
Primeiramente, obrigado pela biblioteca é de grande ajuda!
Estou tentando implementar a formatação para valores monetários, porém, não consigo adicionar valores negativos.
Exemplo: - R$ 100,00 ou R$ -100,00
Existe alguma forma de fazer isto na biblioteca?
Obrigado !
Adicionar formatação e validação de telefone com as seguintes opções:
A lib consegue suportar múltiplas máscaras para um mesmo EditText e ir se adequando a mais provável de acordo com o dado inserido? Ou seja, determinar qual deve ser aplicada dentre as máscaras de um conjunto, ex.: Sem o nono dígito "(##) ####-####" e com o nono dígito "(##) # ####-####"
Olá, achei muito bons os "watchers". Há a intenção de criar um callback para o ValorMonetarioWatcher?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.