Thinking on hiring me?

Please read

Fernando Guillén

a Freelance Web Developer

cabecera decorativa

software development as an artistic expression

2 horas programando para 4 líneas

Es lo que tiene ruby.

Llevo un par de horas intentando sacar un Float en formato ‘d.ddd.ddd,dd’. Hay muchas cosas en internet para conseguirlo, pero no todas funcionaban bien, y otras funcionaban demasiado bien, con un montón de opciones.

El caso es que hay un helper del ActionView que tiene la función number_to_currency pero es un cabroncete de helper y no podía acceder desde el modelo. También teníamos la gema Currency pero era un pedazo monstruo para la tontada que yo quería.

Al final la gema Scruffy me ha dado la pista y esto es lo que tengo:

class Float
  def en_euros
    parts = sprintf("%01.#{2}f", self).split('.')
    parts[0].to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1.") + "," + parts[1].to_s
  end
end

Es un parchecito del Float para poder hacer esto:

>> 1234.566.en_euros
=> "1.234,57"
7 Comments to “2 horas programando para 4 líneas”
  1. Damu Says:

    No entendi porque no usabas directamente number_to_currency en la vista y listo…

  2. fguillen Says:

    Porque me quedaba un churro como este:

    number_to_currency( num, :unit => "€", :separator => ",", :delimiter => ".", :format => "%n %u" )

    En un montón de sitios.

    Intenté wrappearlo en un método de mi application_helper tal que así:

      def en_euros( num )
        number_to_currency( num, :unit => "€", :separator => ",", :delimiter => ".", :format => "%n %u" )
      end

    Y funcionaba bien en las vistas, pero no en la plantilla del mail que también hace uso de este formato. :/

    En el mail me decía:

    undefined method `en_euros' for #<ActionView::Base:0x23dd98c>

    Así que entre una cosa y otra me lancé a intentar que la manera fuera más al rollo que está ahora Float.en_euros .. me parece lo más elegante.

    Saludos
    f.

  3. Damu Says:

    Intenta colocando un
    include ApplicationHelper
    en tu clases Mailer. Deberia quedar algo por el estilo:

    class Mailer < ActionMailer::Base
    include ApplicationHelper

    Ahi deberias poder usar tus helpers en las plantillas de emails.
    Es elegante lo de Float.en_euros, pero en realidad creo que es mas una cuestion de vista, asi que usar el helper me parece mas elegante aun ;-)
    Saludos!

  4. fguillen Says:

    Estoy completamente de acuerdo contigo en que este asunto hay que resolverlo en la Vista. Es sólo que no me salía.

    Estoy probando lo que me dices y con el include tal que ahí no me ha funcionado porque el método lo busca en el ActionView no en el ActionMailer.

    Al final lo he podido resolver poniendo esto en el enviroment.rb:

    ActionView::Base.send(:include, ApplicationHelper)

    Seguro que no es la mejor manera.

    Gracias por picarme :P
    f.

  5. Agustín Vivancos Says:

    Mi profesor siempre dijo que los que programan menos líneas siempre que se cumpla la función requerida, son los mejores.

  6. fguillen Says:

    No estoy del todo de acuerdo contigo Agustín, yo creo que el código debe ser legible, comprensible y mantenible.

    Hacerlo en el menor número de líneas es un ejercicio de competición que muchas veces se pelea con las características que he enumerado.

    f.

  7. nightlife split Says:

    Useful info. Lucky me I discovered your site by accident, and I am shocked why this coincidence
    didn’t took place earlier! I bookmarked it.

Leave a comment

a Freelance Web Developer is proudly powered by WordPress
Entries (RSS) and Comments (RSS).

Creative Commons License
Fernando Guillen's blog by Fernando Guillen is licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License.