Sqliteで1000番目の区切り文字としてカンマを持つように整数列をフォーマットすることはできますか?私は、クエリの結果を次のようにしたいと思います。Sqlite:整数をフォーマットする
Id Name Price
1 Product1 1,000
2 Product2 2,500
Sqliteで1000番目の区切り文字としてカンマを持つように整数列をフォーマットすることはできますか?私は、クエリの結果を次のようにしたいと思います。Sqlite:整数をフォーマットする
Id Name Price
1 Product1 1,000
2 Product2 2,500
ありのSQLiteに組み込まれた内部番号の書式設定機能はありませんが、1を作成するためにuser-defined functionを作成することができます。
実例があります。整数を使用し、浮動小数点数の調整が必要です。あなたのデータは、テーブルに格納され、あなたがSQLite version 3.8.3以上を使用している場合
#import <sqlite3.h>
static char *sepnum(int num, char *buf, size_t buflen, char sepch)
{
int len = 0, negative = 0;
if (!buf || buflen == 0) return buf;
if (num < 0)
{
negative = 1;
num = abs(num);
}
for (int i=1;;i++)
{
if (buflen>len+1) buf[len++] = '0' + (num % 10);
num /= 10;
if (num==0) break;
if ((i % 3) == 0 && buflen>len+1) buf[len++] = sepch;
}
if (negative && buflen>len+1) buf[len++] = '-';
for (int i=0;i<len/2;i++)
{
buf[len] = buf[i];
buf[i] = buf[len-i-1];
buf[len-i-1] = buf[len];
}
if (buflen>len) buf[len] = '\0';
else buf[0] = '\0';
return buf;
}
static void nformat(sqlite3_context *context, int argc, sqlite3_value **argv)
{
if (argc == 1)
{
int num = sqlite3_value_int(argv[0]);
char buf[500] = "";
if (sepnum(num, buf, sizeof(buf), ','))
{
sqlite3_result_text(context, buf, -1, SQLITE_TRANSIENT);
return;
}
}
sqlite3_result_null(context);
}
int main(int argc, char *argv[])
{
sqlite3 *db;
sqlite3_open(":memory:", &db);
sqlite3_stmt *stmt;
sqlite3_create_function(db, "nformat", 1, SQLITE_UTF8, NULL, &nformat, NULL, NULL);
sqlite3_prepare(db, "select nformat(1234)", -1, &stmt, NULL);
sqlite3_step(stmt);
printf("[%s]\n", sqlite3_column_text(stmt, 0));
}
ご返信ありがとうございます。私はdev envがAndroidであることを忘れていました。だから私はあなたの解決策を試していない。 – wannik
、あなたが再帰CTEを使用して欲しいものを達成することが可能です。
以下は、私が言及している作業SQLの例です。あなたのテーブルには、次の番号含まれている場合
WITH
NBR_LIST_ETL AS
(
SELECT
A.*,
CAST(REPLACE(NBR_LENGTH % 3, 0, 3) AS INTEGER)
AS SUB_STRING_LENGTH
FROM
(
SELECT
ID, -- INTEGER PRIMARY KEY COLUMN
NBR, -- INTEGER COLUMN YOU WANT TO FORMAT W/ COMMAS
LENGTH(NBR)
AS NBR_LENGTH
FROM
NBR_LIST A -- REPLACE NBR_LIST W/ YOUR TABLE NAME
) A
),
NBR_FORMAT_RECURSIVE AS
(
SELECT
ID,
SUBSTR(NBR, 1, SUB_STRING_LENGTH)
AS NBR_SEGMENT,
SUBSTR(NBR, SUB_STRING_LENGTH + 1)
AS NBR_REMAINING,
NBR_LENGTH - SUB_STRING_LENGTH
AS NBR_LENGTH
FROM
NBR_LIST_ETL
UNION ALL
SELECT
ID,
SUBSTR(NBR_REMAINING, 1, 3)
AS NBR_SEGMENT,
SUBSTR(NBR_REMAINING, 4)
AS NBR_REMAINING,
NBR_LENGTH - 3
AS NBR_LENGTH
FROM
NBR_FORMAT_RECURSIVE
WHERE
NBR_LENGTH >= 3
)
SELECT
GROUP_CONCAT(NBR_SEGMENT)
AS NBR_FORMATTED
FROM
NBR_FORMAT_RECURSIVE
GROUP BY
ID
-
NBR
25271
7
29
75438175
342
212
4758
863
2313917
を次にクエリが出力でしょう - あなたはそれ文字フィールドにする場合を除き
NBR_FORMATTED
25,271
7
29
75,438,175
342
212
4,758
863
2,313,917
SQLiteは、フォーマットを認識していません。データを抽出するために使用するプログラムは、書式設定を担当します。 –
理想的には、SQLiteを呼び出す環境がそれを処理します。 – MPelletier