18
18
19
19
#include "php_intl.h"
20
20
21
+ #include <unicode/unumberformatter.h>
21
22
#include <unicode/ustring.h>
22
23
23
24
#include "formatter_class.h"
28
29
PHP_FUNCTION ( numfmt_format )
29
30
{
30
31
zval * number ;
32
+ UFormattedNumber * result = NULL ;
31
33
zend_long type = FORMAT_TYPE_DEFAULT ;
32
34
UChar format_buf [32 ];
33
35
UChar * formatted = format_buf ;
@@ -42,7 +44,12 @@ PHP_FUNCTION( numfmt_format )
42
44
}
43
45
44
46
/* Fetch the object. */
45
- FORMATTER_METHOD_FETCH_OBJECT ;
47
+ FORMATTER_METHOD_FETCH_OBJECT2 ;
48
+
49
+ if (FORMATTER_OBJECT2 (nfo )) {
50
+ result = unumf_openResult (& INTL_DATA_ERROR_CODE (nfo ));
51
+ INTL_METHOD_CHECK_STATUS (nfo , "Error opening formatter result" );
52
+ }
46
53
47
54
if (type == FORMAT_TYPE_DEFAULT ) {
48
55
switch (Z_TYPE_P (number )) {
@@ -60,48 +67,77 @@ PHP_FUNCTION( numfmt_format )
60
67
switch (type ) {
61
68
case FORMAT_TYPE_INT32 :
62
69
convert_to_long (number );
63
- formatted_len = unum_format (FORMATTER_OBJECT (nfo ), (int32_t )Z_LVAL_P (number ),
64
- formatted , formatted_len , NULL , & INTL_DATA_ERROR_CODE (nfo ));
70
+ if (FORMATTER_OBJECT (nfo )) {
71
+ formatted_len = unum_format (FORMATTER_OBJECT (nfo ), (int32_t )Z_LVAL_P (number ),
72
+ formatted , formatted_len , NULL , & INTL_DATA_ERROR_CODE (nfo ));
73
+ } else {
74
+ unumf_formatInt (FORMATTER_OBJECT2 (nfo ), (int32_t )Z_LVAL_P (number ), result , & INTL_DATA_ERROR_CODE (nfo ));
75
+ formatted_len = unumf_resultToString (result , formatted , formatted_len , & INTL_DATA_ERROR_CODE (nfo ));
76
+ }
77
+ INTL_METHOD_CHECK_STATUS ( nfo , "Number formatting failed" );
65
78
if (INTL_DATA_ERROR_CODE (nfo ) == U_BUFFER_OVERFLOW_ERROR ) {
66
79
intl_error_reset (INTL_DATA_ERROR_P (nfo ));
67
80
formatted = eumalloc (formatted_len );
68
- formatted_len = unum_format (FORMATTER_OBJECT (nfo ), (int32_t )Z_LVAL_P (number ),
69
- formatted , formatted_len , NULL , & INTL_DATA_ERROR_CODE (nfo ));
81
+ if (FORMATTER_OBJECT (nfo )) {
82
+ formatted_len = unum_format (FORMATTER_OBJECT (nfo ), (int32_t )Z_LVAL_P (number ),
83
+ formatted , formatted_len , NULL , & INTL_DATA_ERROR_CODE (nfo ));
84
+ } else {
85
+ formatted_len = unumf_resultToString (result , formatted , formatted_len , & INTL_DATA_ERROR_CODE (nfo ));
86
+ }
70
87
if (U_FAILURE ( INTL_DATA_ERROR_CODE (nfo ) ) ) {
71
88
efree (formatted );
72
89
}
73
90
}
74
- INTL_METHOD_CHECK_STATUS ( nfo , "Number formatting failed" );
75
91
break ;
76
92
77
93
case FORMAT_TYPE_INT64 :
78
94
{
79
95
int64_t value = (Z_TYPE_P (number ) == IS_DOUBLE )?(int64_t )Z_DVAL_P (number ):Z_LVAL_P (number );
80
- formatted_len = unum_formatInt64 (FORMATTER_OBJECT (nfo ), value , formatted , formatted_len , NULL , & INTL_DATA_ERROR_CODE (nfo ));
96
+ if (FORMATTER_OBJECT (nfo )) {
97
+ formatted_len = unum_formatInt64 (FORMATTER_OBJECT (nfo ), value , formatted , formatted_len , NULL , & INTL_DATA_ERROR_CODE (nfo ));
98
+ } else {
99
+ unumf_formatInt (FORMATTER_OBJECT2 (nfo ), value , result , & INTL_DATA_ERROR_CODE (nfo ));
100
+ INTL_METHOD_CHECK_STATUS ( nfo , "Number formatting failed" );
101
+ formatted_len = unumf_resultToString (result , formatted , formatted_len , & INTL_DATA_ERROR_CODE (nfo ));
102
+ }
81
103
if (INTL_DATA_ERROR_CODE (nfo ) == U_BUFFER_OVERFLOW_ERROR ) {
82
104
intl_error_reset (INTL_DATA_ERROR_P (nfo ));
83
105
formatted = eumalloc (formatted_len );
84
- formatted_len = unum_formatInt64 (FORMATTER_OBJECT (nfo ), value , formatted , formatted_len , NULL , & INTL_DATA_ERROR_CODE (nfo ));
106
+ if (FORMATTER_OBJECT (nfo )) {
107
+ formatted_len = unum_formatInt64 (FORMATTER_OBJECT (nfo ), value , formatted , formatted_len , NULL , & INTL_DATA_ERROR_CODE (nfo ));
108
+ } else {
109
+ formatted_len = unumf_resultToString (result , formatted , formatted_len , & INTL_DATA_ERROR_CODE (nfo ));
110
+ }
85
111
if (U_FAILURE ( INTL_DATA_ERROR_CODE (nfo ) ) ) {
86
112
efree (formatted );
87
113
}
88
114
}
89
- INTL_METHOD_CHECK_STATUS ( nfo , "Number formatting failed" );
115
+ INTL_METHOD_CHECK_STATUS ( nfo , "Number formatting to string failed" );
90
116
}
91
117
break ;
92
118
93
119
case FORMAT_TYPE_DOUBLE :
94
120
convert_to_double (number );
95
- formatted_len = unum_formatDouble (FORMATTER_OBJECT (nfo ), Z_DVAL_P (number ), formatted , formatted_len , NULL , & INTL_DATA_ERROR_CODE (nfo ));
121
+ if (FORMATTER_OBJECT (nfo )) {
122
+ formatted_len = unum_formatDouble (FORMATTER_OBJECT (nfo ), Z_DVAL_P (number ), formatted , formatted_len , NULL , & INTL_DATA_ERROR_CODE (nfo ));
123
+ } else {
124
+ unumf_formatDouble (FORMATTER_OBJECT2 (nfo ), Z_DVAL_P (number ), result , & INTL_DATA_ERROR_CODE (nfo ));
125
+ INTL_METHOD_CHECK_STATUS ( nfo , "Number formatting failed" );
126
+ formatted_len = unumf_resultToString (result , formatted , formatted_len , & INTL_DATA_ERROR_CODE (nfo ));
127
+ }
96
128
if (INTL_DATA_ERROR_CODE (nfo ) == U_BUFFER_OVERFLOW_ERROR ) {
97
129
intl_error_reset (INTL_DATA_ERROR_P (nfo ));
98
130
formatted = eumalloc (formatted_len );
99
- unum_formatDouble (FORMATTER_OBJECT (nfo ), Z_DVAL_P (number ), formatted , formatted_len , NULL , & INTL_DATA_ERROR_CODE (nfo ));
131
+ if (FORMATTER_OBJECT (nfo )) {
132
+ unum_formatDouble (FORMATTER_OBJECT (nfo ), Z_DVAL_P (number ), formatted , formatted_len , NULL , & INTL_DATA_ERROR_CODE (nfo ));
133
+ } else {
134
+ formatted_len = unumf_resultToString (result , formatted , formatted_len , & INTL_DATA_ERROR_CODE (nfo ));
135
+ }
100
136
if (U_FAILURE ( INTL_DATA_ERROR_CODE (nfo ) ) ) {
101
137
efree (formatted );
102
138
}
103
139
}
104
- INTL_METHOD_CHECK_STATUS ( nfo , "Number formatting failed" );
140
+ INTL_METHOD_CHECK_STATUS ( nfo , "Number formatting to string failed" );
105
141
break ;
106
142
case FORMAT_TYPE_CURRENCY :
107
143
if (getThis ()) {
@@ -119,6 +155,8 @@ PHP_FUNCTION( numfmt_format )
119
155
}
120
156
121
157
INTL_METHOD_RETVAL_UTF8 ( nfo , formatted , formatted_len , ( formatted != format_buf ) );
158
+
159
+ unumf_closeResult (result );
122
160
}
123
161
/* }}} */
124
162
0 commit comments