sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    Float <-> String - Locale aware?

    Scheduled Pinned Locked Moved Developers' Forum
    35 Posts 5 Posters 9.0k Views 5 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • thomthomT Offline
      thomthom
      last edited by

      @dan rathbun said:

      What happens when:
      length = "5.43".to_l

      length = "5.43".to_l Error: #<ArgumentError: (eval):894:into_l': Cannot convert "5.43" to Length>
      (eval):894`

      Thomas Thomassen — SketchUp Monkey & Coding addict
      List of my plugins and link to the CookieWare fund

      1 Reply Last reply Reply Quote 0
      • thomthomT Offline
        thomthom
        last edited by

        @cjthompson said:

        Why won't "12,2".to_l.to_f work?

        "12,2".to_l.to_f 0.480314960629921

        It doesn't work because SU does unit conversion at the same time.

        Thomas Thomassen — SketchUp Monkey & Coding addict
        List of my plugins and link to the CookieWare fund

        1 Reply Last reply Reply Quote 0
        • Dan RathbunD Offline
          Dan Rathbun
          last edited by

          Back to the original question, then:

          @thomthom said:

          Is there any methods that do these conversions that are locale aware?

          Are the Sketchup method extensions to the base classes, locale aware and suit your needs ??
          String.to_l
          Numeric.to_l

          I'm not here much anymore.

          1 Reply Last reply Reply Quote 0
          • thomthomT Offline
            thomthom
            last edited by

            @dan rathbun said:

            Back to the original question, then:

            @thomthom said:

            Is there any methods that do these conversions that are locale aware?

            Are the Sketchup method extensions to the base classes, locale aware and suit your needs ??
            String.to_l
            Numeric.to_l

            .to_l and Length.to_s is locale aware. But, it does not suit my needs. I'm trying to convert between String and Float, not between String and Length.

            As mentioned before:
            Sketchup.format_degrees works for Float -> String
            It even has the extra benefit of adhering to the model unit's precision.

            But for String -> Float (where the string is formatted in the user's locale, which might include decimal separator other than a period) I only have this dirty hack:

            
              # Some locale settings uses the comma as decimal separator. .to_f does not
              # account for this, so all commas must be coverted to periods.
              def self.string_to_float(string)
                # Dirty hack to get the current locale's decimal separator, which is then
                # replaced in the string to a period which is what the .to_f method expects.
                @decimal_separator ||= 1.2.to_l.to_s.match(/\d(\D)\d/)[1]
                string.sub(@decimal_separator, '.').to_f
              end
            
            

            Thomas Thomassen — SketchUp Monkey & Coding addict
            List of my plugins and link to the CookieWare fund

            1 Reply Last reply Reply Quote 0
            • Dan RathbunD Offline
              Dan Rathbun
              last edited by

              @thomthom said:

              .to_l and Length.to_s is locale aware. But, it does not suit my needs. I'm trying to convert between String and Float, ... I only have this dirty hack:

              you could subclass class String, and not need the parameter, ie:

              class FloatString < String
                # override to_f method (or name it .to_loc_f )
                def self.to_f
                  # insert your hack
                end
              end # class
              

              Use:
              a = FloatString.new( someString.dup ) puts a.to_f puts a.class >> SomeModule::FloatString

              I'm not here much anymore.

              1 Reply Last reply Reply Quote 0
              • thomthomT Offline
                thomthom
                last edited by

                Well, how I wrap the code is one thing. But atm I'm more concerned about how I get the locale data.

                It just occurred to me that might not be a good choice if one does not want the float to be truncated to the model's degree precision... 😞

                Thomas Thomassen — SketchUp Monkey & Coding addict
                List of my plugins and link to the CookieWare fund

                1 Reply Last reply Reply Quote 0
                • Dan RathbunD Offline
                  Dan Rathbun
                  last edited by

                  We can see if the user is using metric, via:

                  
                  module SU_UNIT
                  #
                  def length_name( arg='nameString' )
                    #
                    model = Sketchup.active_model 
                    manager = model.options 
                    unitopts = manager['UnitsOptions'] 
                    #
                    # allow the ordinal in the set to be returned if arg
                    # is any class other than String (or a String subclass.)
                    return unitopts['LengthUnit'] unless arg.kind_of?(String)
                    #
                    # arg was a String, so return LengthUnit stringname
                    unit=''
                    #
                    if unitopts['LengthFormat']==0 # Decimal
                      unitSet=['Inches','Feet','Millimeters','Centimeters','Meters']
                      unit=unitSet[ unitopts['LengthUnit'] ]
                    elsif unitopts['LengthFormat']==2 # Engineering
                      unit='Feet'
                    else # 1==Architectural, 3==Fractional
                      unit='Inches'
                    end # if
                    #
                    return unit
                    #
                  end # method
                  #
                  end # module
                  
                  

                  %(#4000BF)[EDITED: wrapped in module and method blocks.
                  EDIT2: replaced case statement with array subscript call.
                  EDIT3: corrected ordinal values for LengthFormat (they do NOT appear in dropdown control in their true order!)
                  EDIT4: simplfied ordinal test; renamed method]

                  I'm not here much anymore.

                  1 Reply Last reply Reply Quote 0
                  • Dan RathbunD Offline
                    Dan Rathbun
                    last edited by

                    @thomthom said:

                    decimal_separator = 1.2.to_l.to_s.match(/\d(\D)\d/)[1]
                    This returns the decimal separator.

                    1.23.to_s.tr!('.', decimal_separator)
                    And this outputs a string in the user's locale.

                    Hacky hacky hacky... 🤢

                    Now: how does one do this properly?

                    lets try sprintf (the standard **s**tring print **f**ormatted method,) which returns a formatted String.

                    On your machine how does the following work?
                    ` decplaces=6 # some integer arg or expression
                    sprintf("%##{decplaces}f",51.1230)

                    the first '#' is a format flag

                    the second '#' is part of #{decplaces}`

                    I'm not here much anymore.

                    1 Reply Last reply Reply Quote 0
                    • thomthomT Offline
                      thomthom
                      last edited by

                      Tried that. It's locale unaware.

                      The only stuff I get on Ruby and locale relates to Ruby on Rails. 😞

                      Thomas Thomassen — SketchUp Monkey & Coding addict
                      List of my plugins and link to the CookieWare fund

                      1 Reply Last reply Reply Quote 0
                      • eneroth3E Offline
                        eneroth3
                        last edited by

                        This method only works when format is set to decimal (or engineering which is also decimal) in the model info. If fractional or architectural are used '1.2.to_l.to_s" returns '~ 1 1/4"' without any decimal separator. 😞

                        My website: http://julia-christina-eneroth.se/

                        1 Reply Last reply Reply Quote 0
                        • 1
                        • 2
                        • 2 / 2
                        • First post
                          Last post
                        Buy SketchPlus
                        Buy SUbD
                        Buy WrapR
                        Buy eBook
                        Buy Modelur
                        Buy Vertex Tools
                        Buy SketchCuisine
                        Buy FormFonts

                        Advertisement