Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitbd15782

Browse files
committed
Enable multi-byte thousands_sep and decimal_point for numericsep.
1 parentfbc11b9 commitbd15782

File tree

1 file changed

+39
-37
lines changed

1 file changed

+39
-37
lines changed

‎src/bin/psql/print.c

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*
44
* Copyright (c) 2000-2005, PostgreSQL Global Development Group
55
*
6-
* $PostgreSQL: pgsql/src/bin/psql/print.c,v 1.68 2005/07/1415:54:21 momjian Exp $
6+
* $PostgreSQL: pgsql/src/bin/psql/print.c,v 1.69 2005/07/1421:12:41 momjian Exp $
77
*/
88
#include"postgres_fe.h"
99
#include"common.h"
@@ -50,76 +50,79 @@ pg_local_malloc(size_t size)
5050
}
5151

5252
staticint
53-
num_numericseps(constchar*my_str)
53+
integer_digits(constchar*my_str)
5454
{
55-
intold_len,dec_len,int_len;
56-
intgroupdigits=atoi(grouping);
55+
intfrac_len;
5756

5857
if (my_str[0]=='-')
5958
my_str++;
6059

61-
old_len=strlen(my_str);
62-
dec_len=strchr(my_str,'.') ?strlen(strchr(my_str,'.')) :0;
60+
frac_len=strchr(my_str,'.') ?strlen(strchr(my_str,'.')) :0;
61+
62+
returnstrlen(my_str)-frac_len;
63+
}
64+
65+
staticint
66+
len_numericseps(constchar*my_str)
67+
{
68+
intint_len=integer_digits(my_str),sep_len;
69+
intgroupdigits=atoi(grouping);
6370

64-
int_len=old_len-dec_len;
6571
if (int_len %groupdigits!=0)
66-
returnint_len /groupdigits;
72+
sep_len=int_len /groupdigits;
6773
else
68-
returnint_len /groupdigits-1;/* no leading separator */
74+
sep_len=int_len /groupdigits-1;/* no leading separator */
75+
76+
returnsep_len*strlen(thousands_sep)-
77+
strlen(".")+strlen(decimal_point);
6978
}
7079

7180
staticint
7281
len_with_numericsep(constchar*my_str)
7382
{
74-
returnstrlen(my_str)+num_numericseps(my_str);
83+
returnstrlen(my_str)+len_numericseps(my_str);
7584
}
7685

7786
staticvoid
7887
format_numericsep(char*my_str)
7988
{
80-
inti,j,digits_before_sep,old_len,new_len,dec_len,int_len;
81-
char*new_str;
82-
char*dec_value;
89+
inti,j,int_len=integer_digits(my_str),leading_digits;
8390
intgroupdigits=atoi(grouping);
91+
char*new_str;
8492

8593
if (my_str[0]=='-')
8694
my_str++;
87-
88-
old_len=strlen(my_str);
89-
dec_len=strchr(my_str,'.') ?strlen(strchr(my_str,'.')) :0;
90-
int_len=old_len-dec_len;
91-
digits_before_sep=int_len %groupdigits;
92-
93-
new_len=int_len+int_len /groupdigits+dec_len;
94-
if (digits_before_sep==0)
95-
new_len--;/* no leading separator */
95+
96+
new_str=pg_local_malloc(len_numericseps(my_str)+1);
9697

97-
new_str=pg_local_malloc(new_len+1);
98+
leading_digits= (int_len %groupdigits!=0) ?
99+
int_len %groupdigits :groupdigits;
98100

99101
for (i=0,j=0; ;i++,j++)
100102
{
101-
/*hit decimal point */
103+
/*Hit decimal point? */
102104
if (my_str[i]=='.')
103105
{
104-
new_str[j]=*decimal_point;
105-
new_str[j+1]='\0';
106-
dec_value=strchr(my_str,'.');
107-
strcat(new_str,++dec_value);
106+
strcpy(&new_str[j],decimal_point);
107+
j+=strlen(decimal_point);
108+
/* add fractional part */
109+
strcpy(&new_str[j],&my_str[i]+1);
108110
break;
109111
}
110112

111-
/*end of string */
113+
/*End of string? */
112114
if (my_str[i]=='\0')
113115
{
114116
new_str[j]='\0';
115117
break;
116118
}
117119

118-
/* add separator? */
119-
if (i!=0&&
120-
(i- (digits_before_sep ?digits_before_sep :groupdigits))
121-
%groupdigits==0)
122-
new_str[j++]=*thousands_sep;
120+
/* Add separator? */
121+
if (i!=0&& (i-leading_digits) %groupdigits==0)
122+
{
123+
strcpy(&new_str[j],thousands_sep);
124+
j+=strlen(thousands_sep);
125+
}
123126

124127
new_str[j]=my_str[i];
125128
}
@@ -396,7 +399,7 @@ print_aligned_text(const char *title, const char *const *headers,
396399
intnumericseps;
397400

398401
if (opt_align[i %col_count]=='r'&&opt_numericsep)
399-
numericseps=num_numericseps(*ptr);
402+
numericseps=len_numericseps(*ptr);
400403
else
401404
numericseps=0;
402405

@@ -613,7 +616,7 @@ print_aligned_vertical(const char *title, const char *const *headers,
613616
intnumericseps;
614617

615618
if (opt_align[i %col_count]=='r'&&opt_numericsep)
616-
numericseps=num_numericseps(*ptr);
619+
numericseps=len_numericseps(*ptr);
617620
else
618621
numericseps=0;
619622

@@ -1711,7 +1714,6 @@ setDecimalLocale(void)
17111714

17121715
extlconv=localeconv();
17131716

1714-
/* These are treated as single-byte strings in the code */
17151717
if (*extlconv->decimal_point)
17161718
decimal_point=strdup(extlconv->decimal_point);
17171719
else

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp