valores decimais, moeda

1.025 visualizações
Pular para a primeira mensagem não lida

Kleber Shimabuku

não lida,
23 de jul. de 2011, 06:50:5823/07/2011
para rails-br
Fala pessoal,

Num form, o usuário deverá entrar com um valor que poderá ou não ser
decimal, para isso, estou usando um campo do tipo float.

O que acontece é que nem sempre os usuários irão entrar com valores
decimais utilizando de "." como separador, muitos usarão a ",". E
quando usa-se a "," para separar a parte inteira do decimal, está
gravando apenas a parte inteira.

Gostaria de substituir a "," por "." caso seja necessário e para isso
tentei o seguinte no model.


class MyModel < ActiveRecord::Base
before_save :verify_for_bad_entrie_on_quotation
before_update :verify_for_bad_entrie_on_quotation

def verify_for_bad_entrie_on_quotation
self.quotation = self.quotation.to_s.gsub(/,/, '.').to_f
end

end

Porém sem sucesso.. alguém já precisou contornar essa situação? e como
o fez?


Obrigado,

Kleber.

Everaldo Gomes

não lida,
23 de jul. de 2011, 06:55:2223/07/2011
para rail...@googlegroups.com
Bom dia!

Sou iniciante em Rails, estou lendo o livro Rails 3 Way.

Posso ajudar pouco, mas vamos lá:

Primeiro, talvez não seja uma boa idéia usar :float, se você for fazer cálculos. Use :decimal

Por exemplo:

0.1 + 0.2 não é igual a 0.3 em float

porque 0.1 é dízima periódica na base binária.


Quanto à questão de ponto ou vírgula lembro de ter lido algo a respeito de conversão de valores antes da persistência.

O que eu sugiro, "de sopetão", é que você pegue os valores antes de serem convertidos e substitua vírgula por ponto ou vice-versa, com a função .tr da classe String ou algo do tipo.


Boa sorte.

Everaldo


2011/7/23 Kleber Shimabuku <klebers...@gmail.com>

--
Você está recebendo esta mensagem porque se inscreveu no grupo "rails-br" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para rail...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para rails-br+u...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/rails-br?hl=pt-BR.


Everaldo Gomes

não lida,
23 de jul. de 2011, 07:05:0623/07/2011
para rail...@googlegroups.com
Capítulo 6 - Active Record Migrations - p. 170 e 171

Tim says . . .

If you’re using a float to store values which need to be precise, such as money, you’re a jackass.
Floating point calculations are done in binary rather than decimal, so rounding errors abound in
places you wouldn’t expect.
>> 0. 1+0. 2 == 0. 3
=> false
>> BigDecimal( ' 0. 1' ) + BigDecimal(' 0. 2' ) == BigDecimal( ' 0. 3' )
=> true

---------------

: float Don’t use floats to store currency values, or more accurately, any type of data
that needs fixed precision. Since floating-point numbers are pretty much approximations, any single representation ofa number as a float is probably okay. However,
once you start doing mathematical operations or comparisons with float values, it is
ridiculously easy to introduce difficult to diagnose bugs into your application.


----------------

página 131

5.4.4 Accessing and Manipulating Attributes Before
They Are Typecast
The Active Record connection adapters, classes that implement behavior specific to
databases, fetch results as strings. Rails then takes care of converting them to other
datatypes if necessary, based on the type of the database column. For instance, integer
types are cast to instances of Ruby’s Fixnum class, and so on.
Even if you’re working with a new instance of an Active Record object, and have
passed in constructor values as strings, they will be typecast to their proper type when
you try to access those values as attributes.
Sometimes you want to be able to read (or manipulate) the raw attribute datawithout
having the column-determined typecast run its course first, and that can be done by using
the attribute_before_type_cast accessors that are automatically created in your
model.
For example, consider the need to deal with currency strings typed in by your
end users. Unless you are encapsulating currency values in a currency class (highly
recommended, by the way) you need to deal with those pesky dollar signs and commas.
Assuming that our Timesheet model had a rate attribute defined as a : decimal type,
the following code would strip out the extraneous characters before typecasting for the
save operation:

class Timesheet < ActiveRecord: : Base
  before_validation : fix_rate
    def fix_rate 
      self[: rate] = rate_before_type_cast. tr(' $, ' , ' ' )
    end
end


Ótimo livro, vale a pena comprar.....


Abraços,
Everaldo

2011/7/23 Everaldo Gomes <everald...@gmail.com>

Kleber Shimabuku

não lida,
23 de jul. de 2011, 08:09:1623/07/2011
para rails-br
Show!

Valeu Everaldo, vou tentar por aqui :-)

vitor francisco

não lida,
23 de jul. de 2011, 09:14:4323/07/2011
para rail...@googlegroups.com
Hail Kleber,

vc pode deixar aviso no campo, e validar com javascript tb , assim fica mais interativo.

Em 23 de julho de 2011 09:09, Kleber Shimabuku <klebers...@gmail.com> escreveu:
Show!

Valeu Everaldo, vou tentar por aqui :-)

--
Você está recebendo esta mensagem porque se inscreveu no grupo "rails-br" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para rail...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para rails-br+u...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/rails-br?hl=pt-BR.




--


Carpe Diem !


Vitor Santos - TI Engineer
Word is OpenSource -- Linux User 


Marcos Piccinini

não lida,
23 de jul. de 2011, 15:00:1823/07/2011
para rail...@googlegroups.com
Eu curto a solução da gem "money".
Ao invés de decimal, tudo é integer.
Basta dividir por 100 na exibição(ele já faz)

> +unsub...@googlegroups.com.

Kleber Shimabuku

não lida,
25 de jul. de 2011, 08:55:3425/07/2011
para rails-br
@Everaldo, funcionou certinho, valeu!

@Vitor, valeu! mas como não sei as condições das máquinas que irão
rodar o app, fazendo algo server-side acho mais garantido.


On Jul 23, 10:14 pm, vitor francisco <vitorf...@gmail.com> wrote:
> Hail Kleber,
>
> vc pode deixar aviso no campo, e validar com javascript tb , assim fica mais
> interativo.
>
> Em 23 de julho de 2011 09:09, Kleber Shimabuku
> <klebershimab...@gmail.com>escreveu:
>
> > Show!
>
> > Valeu Everaldo, vou tentar por aqui :-)
>
> > --
> > Você está recebendo esta mensagem porque se inscreveu no grupo "rails-br"
> > dos Grupos do Google.
> > Para postar neste grupo, envie um e-mail para rail...@googlegroups.com.
> > Para cancelar a inscrição nesse grupo, envie um e-mail para
> > rails-br+u...@googlegroups.com.
> > Para obter mais opções, visite esse grupo em
> >http://groups.google.com/group/rails-br?hl=pt-BR.
>
> --
> *
>
> Carpe Diem !
> **
>
> Vitor Santos - TI Engineer
> *

Everaldo Gomes

não lida,
25 de jul. de 2011, 09:13:0825/07/2011
para rail...@googlegroups.com
Que bom que funcionou!

Veja também que sugeriram uma gem chamada money.

Talvez seja uma boa solução para agora, ou para uso futuro.

Boa sorte!

[]s

Everaldo

2011/7/25 Kleber Shimabuku <klebers...@gmail.com>

Renato Gil

não lida,
26 de jul. de 2011, 08:55:3526/07/2011
para rails-br
A parte do "jackass" no livro foi boa! hUEIAHOEUIAHIUEHAE!

Rogério Alexandre

não lida,
26 de fev. de 2013, 13:46:2726/02/2013
para rail...@googlegroups.com
Olá Everaldo, 

Tentei o exemplo que vc passou aqui do livro mas não consegui um bom resultado. Meu campo price de property é decimal.

Eu tenho uma máscara jquery tornando meu preço assim: R$ 250 000,00

$("#property_price").maskMoney({symbol:'R$ ', thousands:' ', decimal:','});

Tentei seguir o exemplo desse livro que vc passou e fiz assim:

#property class

  before_validation :fix_money

  def fix_money
    self[:rate] = price_before_type_cast. tr(' ' , '' )
  end

ou seja, onde tem o espaço simplesmente tiraria o espaço, o símbolo é retirado pelo próprio javascript.

O resultado é que se por exemplo digito R$ 300 000,00. O que fica sendo salvo é 300.00 e por consequência o que é exibido com number_to_currency (usando a api de i18n pt-BR) é R$ 300,00

Alguma luz?

Obrigado!

Everaldo Gomes

não lida,
26 de fev. de 2013, 13:57:1526/02/2013
para rail...@googlegroups.com
Oi! Qual é o nome do campo? Vou supor que é price, ok?

Tente assim:

def fix_money
    self[:price] = price_before_type_cast. tr("R$,. " , "'' ) ##troca tudo que não é digito por "nada"
  end

Att.

Everaldo


--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+u...@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "rails-br" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para rails-br+u...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Rogério Alexandre

não lida,
26 de fev. de 2013, 14:00:1526/02/2013
para rail...@googlegroups.com
TYPO

ao invés de  self[:rate] era self[:price].

Rogério Alexandre

não lida,
26 de fev. de 2013, 14:00:5326/02/2013
para rail...@googlegroups.com
Obrigado! Era esse o problema!

Everaldo Gomes

não lida,
26 de fev. de 2013, 14:01:2926/02/2013
para rail...@googlegroups.com
:) de nada.

Rogério Alexandre

não lida,
26 de fev. de 2013, 14:08:2126/02/2013
para rail...@googlegroups.com
Sobre o livro Active Record Migrations. Não encontrei ele. É da Pragmatic Programming?

Everaldo Gomes

não lida,
26 de fev. de 2013, 14:09:1326/02/2013
para rail...@googlegroups.com
Oi. O livro é "Rails 3 Way" do Obie Fernandez. É da Addison Wesley.

Rogério Alexandre

não lida,
26 de fev. de 2013, 14:12:4626/02/2013
para rail...@googlegroups.com
Entao é melhor esperar o Rails 4 Way. hahah
Abraço

2013/2/26 Everaldo Gomes <everald...@gmail.com>

Everaldo Gomes

não lida,
26 de fev. de 2013, 14:22:1026/02/2013
para rail...@googlegroups.com
Hahhaahaahahah.

É um livro bem técnico, mais para referência mesmo...só li os primeiros capítulos.

Não que o livro seja ruim, mas quando eu comprei já tinha saído o Rails 3.1, que mudou bastante coisa.

Talvez seja melhor um livro mais prático, ou mesmo assinar o Railscasts etc.

Abraços




2013/2/26 Rogério Alexandre <roger...@gmail.com>

Pedro Mamede

não lida,
26 de fev. de 2013, 14:39:3126/02/2013
para rail...@googlegroups.com
Oi pessoal. Enquanto a um livro mais prático eu recomendo esse: 

Pedro Mamede

não lida,
26 de fev. de 2013, 14:40:5526/02/2013
para rail...@googlegroups.com
PS: A quarta edição dele cobre Rails 3.2.x e com certeza cobrirá o rails 4 em um futuro próximo.

Rogério Alexandre

não lida,
27 de fev. de 2013, 08:40:4627/02/2013
para rail...@googlegroups.com
Só percebi hoje que aquilo que fiz ontem funciona bem no cadastro, mas na hora de atualizar o registro tenho o problema que o campo é preenchido com 300000.00 se ele nao for atualizado. Atualizar o endereço do imóvel por exemplo.

Quando mando atualizar 

  def fix_money
    self[:price] = price_before_type_cast. tr('.' , '' ) if self[:price].present?
  end

o fix money funciona ok tira o ponto e meu número que era 300 mil reais vira 30 milhões.

Eu poderia fazer o plugin moneymask carregar automático a mascara. Mas nao consegui. A opção autoLoad parece ser ignorada.

jQuery(function($){
  $("#property_cep").mask("99999-999");
$("#property_price").maskMoney({thousands:'.', decimal:',', autoLoad: true});
});

Grato

Rogério

Rogério Alexandre

não lida,
27 de fev. de 2013, 12:24:3727/02/2013
para rail...@googlegroups.com
Resolvi da seguinte forma:

Como estou usando simple_form criei um input currency

class CurrencyInput < SimpleForm::Inputs::Base

  def input
    value = object.send(attribute_name).to_s
    value.gsub!('.', ',') unless value.blank?
    input_html_options[:value] = value
    %{<span class="add-on">R$</span> #{@builder.text_field(attribute_name, input_html_options)}}.html_safe
  end

end

Se estivesse usando formulário padrão do rails poderia usar o seguinte:

ActionView::Helpers::FormBuilder.class_eval do

  def number_field(field, options = {})
    value = object.send(field).to_s                   
    value.gsub!('.', ',') unless value.blank?  
    options[:value] = value
    options[:class] = "#{options[:class]} number_field"
    text_field(field, options)
  end

end

Rogério Alexandre

não lida,
27 de fev. de 2013, 12:25:2427/02/2013
para rail...@googlegroups.com
Ainda estou um pouquinho frustrado de não ter conseguido que o jquery money mask já aplicasse a máscara ao carregar o form, teria evitado o server side.
 Além do mais o campo quando estou na página de atualizar nao está muito bacana. Fica assim: 250000,0

Everaldo Gomes

não lida,
27 de fev. de 2013, 13:07:3327/02/2013
para rail...@googlegroups.com
Eu tô meio lerdo hoje...conseguiu resolver?

O problema dos 300 mil / 30 milhões não é só dividir por 100?


Abraços


2013/2/27 Rogério Alexandre <roger...@gmail.com>

Rogério Alexandre

não lida,
27 de fev. de 2013, 13:09:2527/02/2013
para rail...@googlegroups.com
Eu resolvi, postei a solução na lista. Mas ainda ficou um detalhe pra trás.

Obrigado!

2013/2/27 Everaldo Gomes <everald...@gmail.com>
Você recebeu esta mensagem porque está inscrito em um tópico do grupo "rails-br" dos Grupos do Google.
Para cancelar a inscrição neste tópico, acesse https://groups.google.com/d/topic/rails-br/ffFIrgpig3E/unsubscribe?hl=pt-BR.
Para cancelar a inscrição neste grupo e todos os seus tópicos, envie um e-mail para rails-br+u...@googlegroups.com.

Everaldo Gomes

não lida,
27 de fev. de 2013, 13:10:5827/02/2013
para rail...@googlegroups.com
Qual? Do Javascript você não pode usar "onload" ou algo do tipo?


2013/2/27 Rogério Alexandre <roger...@gmail.com>

Rogério Alexandre

não lida,
27 de fev. de 2013, 13:18:2727/02/2013
para rail...@googlegroups.com
Exatamente!

2013/2/27 Everaldo Gomes <everald...@gmail.com>
Responder a todos
Responder ao autor
Encaminhar
0 nova mensagem