2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-01-31 18:59:33 +00:00

Unit.pm: add decimal mark support

git-svn-id: https://svn.fhem.de/fhem/trunk@12677 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
jpawlowski 2016-11-27 16:34:00 +00:00
parent b309c0a76a
commit fa5c50cd0e
2 changed files with 227 additions and 81 deletions

View File

@ -445,17 +445,6 @@ sub values2weathercondition($$$$$) {
return $condition;
}
#################################
### Logfile integer conversions
###
sub activity2log($) {
my ($data) = @_;
return "1" if ( $data =~ /^(alive|ok)$/i );
return "0";
}
#TODO rewrite for Unit.pm
sub fmtTime($) {
my ($value) = @_;
@ -478,6 +467,21 @@ sub fmtTime($) {
####################
# HELPER FUNCTIONS
sub decimal_mark ($$) {
my ( $v, $f ) = @_;
return $v unless ( looks_like_number($v) && $f );
my $text = reverse $v;
if ( $f eq "2" ) {
$text =~ s:\.:,:g;
$text =~ s/(\d\d\d)(?=\d)(?!\d*,)/$1./g;
}
else {
$text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g;
}
return scalar reverse $text;
}
sub roundX($;$) {
my ( $v, $n ) = @_;
$n = 1 if ( !$n );

View File

@ -148,6 +148,10 @@ my $rtype_base = {
en => 'length',
},
format => '%.0f',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -160,6 +164,10 @@ my $rtype_base = {
en => 'mass',
},
format => '%.0f',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -172,6 +180,10 @@ my $rtype_base = {
en => 'time',
},
format => '%.0f',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -184,6 +196,10 @@ my $rtype_base = {
en => 'electric current',
},
format => '%.1f',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -196,6 +212,10 @@ my $rtype_base = {
en => 'absolute temperature',
},
format => '%.1f',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -208,6 +228,10 @@ my $rtype_base = {
en => 'amount of substance',
},
format => '%.1f',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -220,6 +244,10 @@ my $rtype_base = {
en => 'luminous intensity',
},
format => '%.1f',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -232,6 +260,10 @@ my $rtype_base = {
en => 'energy',
},
format => '%.1f',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -244,6 +276,10 @@ my $rtype_base = {
en => 'frequency',
},
format => '%i',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -256,6 +292,10 @@ my $rtype_base = {
en => 'power',
},
format => '%.1f',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -268,6 +308,10 @@ my $rtype_base = {
en => 'pressure',
},
format => '%i',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -280,6 +324,10 @@ my $rtype_base = {
en => 'absolute pressure',
},
format => '%i',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -292,6 +340,10 @@ my $rtype_base = {
en => 'air pressure',
},
format => '%i',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -304,6 +356,10 @@ my $rtype_base = {
en => 'electric voltage',
},
format => '%.1f',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -316,6 +372,10 @@ my $rtype_base = {
en => 'plane angular',
},
format => '%i',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -328,6 +388,10 @@ my $rtype_base = {
en => 'speed',
},
format => '%i',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -340,6 +404,10 @@ my $rtype_base = {
en => 'illumination intensity',
},
format => '%i',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -352,6 +420,10 @@ my $rtype_base = {
en => 'luminous flux',
},
format => '%i',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -364,6 +436,10 @@ my $rtype_base = {
en => 'volume',
},
format => '%i',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -376,6 +452,10 @@ my $rtype_base = {
en => 'logarithmic level',
},
format => '%.1f',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -388,6 +468,10 @@ my $rtype_base = {
en => 'electric charge',
},
format => '%.1f',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -400,6 +484,10 @@ my $rtype_base = {
en => 'electric capacity',
},
format => '%.1f',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -412,6 +500,10 @@ my $rtype_base = {
en => 'electric resistance',
},
format => '%.1f',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -424,6 +516,10 @@ my $rtype_base = {
en => 'surface area',
},
format => '%i',
decimal_mark => {
de => 2,
en => 1,
},
scope => { min => 0 },
},
@ -433,6 +529,10 @@ my $rtype_base = {
en => 'currency',
},
format => '%.2f',
decimal_mark => {
de => 2,
en => 1,
},
scope => '^[0-9]*(?:\.[0-9]*)?$',
},
@ -441,6 +541,11 @@ my $rtype_base = {
de => 'Zahlen',
en => 'Numbering',
},
format => '%.1f',
decimal_mark => {
de => 2,
en => 1,
},
tmpl => '%value%',
},
@ -1242,12 +1347,23 @@ my $rtypes = {
},
# currency
#https://en.wikipedia.org/wiki/Euro
#https://en.wikipedia.org/wiki/Linguistic_issues_concerning_the_euro
euro => {
ref_base => 24,
format => '%.2f',
symbol => '€',
suffix => 'EUR',
txt => 'Euro',
txt => {
de => 'Euro',
en => 'euro',
},
tmpl => {
de => '%symbol%%value%',
de_de => '%value%' . chr(0x202F) . '%symbol%',
en => '%symbol%%value%',
},
scope => '^([0-9]*(?:\.[0-9]*)?)$',
},
@ -1258,15 +1374,15 @@ my $rtypes = {
suffix => 'GBP',
txt => {
de => 'Pfund',
en => 'Pound',
en => 'pound',
},
txt_long => {
de => 'Britisches Pfund',
en => 'British Pound',
en => 'British pound',
},
txt_long_pl => {
de => 'Britische Pfund',
en => 'British Pound',
en => 'British pound',
},
tmpl => '%symbol%%value%',
tmpl_long => '%value%' . chr(0x00A0) . '%txt_long%',
@ -1278,8 +1394,14 @@ my $rtypes = {
format => '%.2f',
symbol => '$',
suffix => 'USD',
txt => 'Dollar',
txt_long => 'US Dollar',
txt => {
de => 'Dollar',
en => 'dollar',
},
txt_long => {
de => 'US Dollar',
en => 'US dollar',
},
tmpl => '%symbol%%value%',
tmpl_long => '%value%' . chr(0x00A0) . '%txt_long%',
scope => '^([0-9]*(?:\.[0-9]*)?)$',
@ -2467,8 +2589,10 @@ sub replaceTemplate ($$$$;$) {
return
if ( !$odesc || ref($odesc) ne "HASH" );
$value = $odesc->{value}
if ( !defined($value) && defined( $odesc->{value} ) );
$value = ${$odesc}{value}{$lang}
if (!defined($value)
&& defined( $odesc->{value} )
&& defined( $odesc->{value}{$lang} ) );
return $value
if ( !defined($value) || $value eq "" );
@ -2485,15 +2609,26 @@ sub replaceTemplate ($$$$;$) {
# keep only defined language if set
foreach ( keys %{$desc} ) {
if ( defined( $desc->{$_} )
&& ref( $desc->{$_} ) eq "HASH"
&& defined( $desc->{$_}{$l} ) )
{
next if ( !defined( $desc->{$_} )
|| ref( $desc->{$_} ) ne "HASH" );
# find any direct format
if ( defined( $desc->{$_}{$l} ) ) {
my $v;
$v = $desc->{$_}{$l};
delete $desc->{$_};
$desc->{$_} = $v if ( defined($v) );
}
# extract xx from xx_yz formats
elsif ( $l =~ /^([a-z]+)(_([a-z]+))?$/i
&& defined( $desc->{$_}{$1} ) )
{
my $v;
$v = $desc->{$_}{$1};
delete $desc->{$_};
$desc->{$_} = $v if ( defined($v) );
}
}
# handle textual types after language normalisation
@ -2604,7 +2739,10 @@ sub replaceTemplate ($$$$;$) {
}
}
foreach my $k ( keys %{$desc} ) {
$txt =~ s/%$k%/$desc->{$k}/g;
my $vdm = $desc->{$k};
$vdm = UConv::decimal_mark( $vdm, $desc->{decimal_mark} )
if ( defined( $desc->{decimal_mark} ) );
$txt =~ s/%$k%/$vdm/g;
}
return ($txt) if ( !wantarray );
@ -2646,7 +2784,10 @@ sub replaceTemplate ($$$$;$) {
}
}
foreach my $k ( keys %{$desc} ) {
$txt_long =~ s/%$k%/$desc->{$k}/g;
my $vdm = $desc->{$k};
$vdm = UConv::decimal_mark( $vdm, $desc->{decimal_mark} )
if ( defined( $desc->{decimal_mark} ) );
$txt_long =~ s/%$k%/$vdm/g;
}
}
@ -2875,7 +3016,8 @@ sub formatValue($$$;$$$$) {
$desc->{value}{$lang} = $value;
$desc->{value_num} = $value_num if ( defined($value_num) );
my ( $txt, $txt_long ) = replaceTemplate( $device, $reading, $desc, $lang );
my ( $txt, $txt_long ) =
replaceTemplate( $device, $reading, $desc, $lang, $value );
$desc->{value_txt}{$lang} = $txt;
$desc->{value_txt_long}{$lang} = $txt_long if ( defined($txt_long) );