Search code examples
pythonfloating-pointnumber-formattingpyvisa

How to convert voltage (or frequency) floating number read backs to mV (or kHz)?


I am successfully able to read back data from an instrument:

  • When the read back is a voltage, I typically read back values such as 5.34e-02 Volts.

  • When the read back is frequency, I typically read values like 2.95e+04or 1.49e+05 with units Hz.

I would like to convert the voltage read back of 5.34e-02 to exponent e-3 (aka millivolts), ie.. 53.4e-3. next, I would like to extract the mantissa 53.4 out of this because I want all my data needs to be in milliVolts.

Similarly, I would like to convert all the frequency such as 2.95e+04 (or 1.49e+05) to kiloHz, ie... 29.5e+03 or 149e+03. Next would like to extract the mantissa 29.5 and 149 from this since all my data needs to be kHz.

Can someone suggest how to do this?


Solution

  • Well, to convert volts to millivolts, you multiply by 1000. To convert Hz to kHz, you divide by 1000.

    >>> reading = 5.34e-02
    >>> millivolts = reading * 1000
    >>> print(millivolts)
    53.400000000000006
    >>> hz = 2.95e+04
    >>> khz = hz /1000
    >>> khz
    29.5
    >>>
    

    FOLLOW-UP

    OK, assuming your real goal is to keep the units the same but adjust the exponent to a multiple of 3, see if this meets your needs.

    
    def convert(val):
        if isinstance(val,int):
            return str(val)
        cvt = f"{val:3.2e}"
        if 'e' not in cvt:
            return cvt
        # a will be #.##
        # b will be -##
        a,b = cvt.split('e')
        exp = int(b)
        if exp % 3 == 0:
            return cvt
        if exp % 3 == 1:
            a = a[0]+a[2]+a[1]+a[3]
            exp = abs(exp-1)
            return f"{a}e{b[0]}{exp:02d}"
        a = a[0]+a[2]+a[3]+a[1]
        exp = abs(exp-2)
        return f"{a}e{b[0]}{exp:02d}"
    
    
    for val in (5.34e-01, 2.95e+03, 5.34e-02, 2.95e+04, 5.34e-03, 2.95e+06):
        print( f"{val:3.2e} ->", convert(val) )
    

    Output:

    5.34e-01 -> 534.e-03
    2.95e+03 -> 2.95e+03
    5.34e-02 -> 53.4e-03
    2.95e+04 -> 29.5e+03
    5.34e-03 -> 5.34e-03
    2.95e+06 -> 2.95e+06