Skip to content

Commit 055493a

Browse files
authored
change currency symbol (#394)
* change currency symbol * minor changes * minor changes
1 parent 6387421 commit 055493a

12 files changed

Lines changed: 132 additions & 51 deletions

File tree

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "@fileverse-dev/dsheet",
33
"private": false,
44
"description": "DSheet",
5-
"version": "2.0.34",
5+
"version": "2.0.35",
66
"main": "dist/index.es.js",
77
"module": "dist/index.es.js",
88
"exports": {

src/sheet-engine/core/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ export {
9090
valueShowEs,
9191
isTypedCurrencyDisplayFormat,
9292
isCurrencyLikeNumberFormat,
93+
buildFiatCurrencyFormat,
94+
quoteSsfLiteral,
9395
// formula
9496
FormulaCache,
9597
groupValuesRefresh,

src/sheet-engine/core/locale/en.ts

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11160,45 +11160,45 @@ export default {
1116011160
currencyDetail: [
1116111161
{ name: 'US dollar', pos: 'before', value: '$', geckoId: 'usd' },
1116211162
{ name: 'EUR', pos: 'before', value: '€', geckoId: 'eur' },
11163-
{ name: 'RMB', pos: 'before', value: 'CN¥', geckoId: 'cny' },
11163+
{ name: 'RMB', pos: 'before', value: '¥', geckoId: 'cny' },
1116411164
{ name: 'GBP', pos: 'before', value: '£', geckoId: 'gbp' },
11165-
{ name: 'HK', pos: 'before', value: 'K$', geckoId: 'hkd' },
11166-
{ name: 'JPY', pos: 'before', value: 'jp¥', geckoId: 'jpy' },
11165+
{ name: 'HK', pos: 'before', value: 'HK$', geckoId: 'hkd' },
11166+
{ name: 'JPY', pos: 'before', value: '', geckoId: 'jpy' },
1116711167
{ name: 'Australian Dollar', pos: 'before', value: 'AU$', geckoId: 'aud' },
1116811168
{ name: 'Bangladeshi Taka', pos: 'before', value: '৳', geckoId: 'bdt' },
11169-
{ name: 'Bahraini Dinar', pos: 'before', value: 'NAR', geckoId: 'bhd' },
11169+
{ name: 'Bahraini Dinar', pos: 'before', value: 'din', geckoId: 'bhd' },
1117011170
{ name: 'Bermudian Dollar', pos: 'before', value: '$', geckoId: 'bmd' },
1117111171
{ name: 'Brazilian real', pos: 'before', value: 'R$', geckoId: 'brl' },
1117211172
{ name: 'Canadian Dollar', pos: 'before', value: 'CA$', geckoId: 'cad' },
11173-
{ name: 'Swiss Franc', pos: 'before', value: 'CF', geckoId: 'chf' },
11174-
{ name: 'Chilean Peso', pos: 'before', value: 'CLP$', geckoId: 'clp' },
11175-
{ name: 'Czech Koruna', pos: 'after', value: 'CZK', geckoId: 'czk' },
11173+
{ name: 'Swiss Franc', pos: 'before', value: 'CHF', geckoId: 'chf' },
11174+
{ name: 'Chilean Peso', pos: 'before', value: '$', geckoId: 'clp' },
11175+
{ name: 'Czech Koruna', pos: 'after', value: '', geckoId: 'czk' },
1117611176
{ name: 'Danish Krone', pos: 'after', value: 'kr', geckoId: 'dkk' },
11177-
{ name: 'Georgian Lari', pos: 'before', value: 'gl', geckoId: 'gel' },
11177+
{ name: 'Georgian Lari', pos: 'before', value: 'GEL', geckoId: 'gel' },
1117811178
{ name: 'Hungarian Forint', pos: 'before', value: 'Ft', geckoId: 'huf' },
1117911179
{ name: 'Indonesian Rupiah', pos: 'before', value: 'Rp', geckoId: 'idr' },
11180-
{ name: 'New Israeli Shekel', pos: 'before', value: 'N£', geckoId: 'ils' },
11180+
{ name: 'New Israeli Shekel', pos: 'before', value: '', geckoId: 'ils' },
1118111181
{ name: 'Indian Rupee', pos: 'before', value: '₹', geckoId: 'inr' },
11182-
{ name: 'Soutth korean won', pos: 'before', value: '₩', geckoId: 'krw' },
11183-
{ name: 'Kuwaiti Dinar', pos: 'before', value: 'KW', geckoId: 'kwd' },
11184-
{ name: 'Sri Lanka Rupee', pos: 'before', value: 'L₹', geckoId: 'lkr' },
11182+
{ name: 'South Korean won', pos: 'before', value: '₩', geckoId: 'krw' },
11183+
{ name: 'Kuwaiti Dinar', pos: 'before', value: 'din', geckoId: 'kwd' },
11184+
{ name: 'Sri Lanka Rupee', pos: 'before', value: 'Rs', geckoId: 'lkr' },
1118511185
{ name: 'Myanmar Kyat', pos: 'before', value: 'K', geckoId: 'mmk' },
11186-
{ name: 'Mexican Peso', pos: 'before', value: 'PO$', geckoId: 'mxn' },
11187-
{ name: 'Malaysian Ringgit', pos: 'before', value: 'R', geckoId: 'myr' },
11186+
{ name: 'Mexican Peso', pos: 'before', value: 'MXN', geckoId: 'mxn' },
11187+
{ name: 'Malaysian Ringgit', pos: 'before', value: 'RM', geckoId: 'myr' },
1118811188
{ name: 'Nigerian Naira', pos: 'before', value: '₦', geckoId: 'ngn' },
11189-
{ name: 'Norwegian Krone', pos: 'after', value: 'kr', geckoId: 'nok' },
11190-
{ name: 'New Zealand Dollar', pos: 'before', value: 'Z$', geckoId: 'nzd' },
11189+
{ name: 'Norwegian Krone', pos: 'after', value: 'kr', geckoId: 'nok' },
11190+
{ name: 'New Zealand Dollar', pos: 'before', value: 'NZ$', geckoId: 'nzd' },
1119111191
{ name: 'Philippine Peso', pos: 'before', value: '₱', geckoId: 'php' },
11192-
{ name: 'Pakistan Rupee', pos: 'before', value: 'P₹', geckoId: 'pkr' },
11192+
{ name: 'Pakistan Rupee', pos: 'before', value: 'Rs', geckoId: 'pkr' },
1119311193
{ name: 'Polish Zloty', pos: 'after', value: 'zł', geckoId: 'pln' },
11194-
{ name: 'Russian Ruble', pos: 'after', value: 'RU', geckoId: 'rub' },
11194+
{ name: 'Russian Ruble', pos: 'after', value: '', geckoId: 'rub' },
1119511195
{ name: 'Saudi Riyal', pos: 'before', value: 'Rial', geckoId: 'sar' },
1119611196
{ name: 'Swedish Krona', pos: 'after', value: 'kr', geckoId: 'sek' },
11197-
{ name: 'Singapore Dollar', pos: 'before', value: 'P$', geckoId: 'sgd' },
11197+
{ name: 'Singapore Dollar', pos: 'before', value: 'S$', geckoId: 'sgd' },
1119811198
{ name: 'Thai Baht', pos: 'before', value: '฿', geckoId: 'thb' },
11199-
{ name: 'Turkish Lira', pos: 'before', value: 'TL', geckoId: 'try' },
11199+
{ name: 'Turkish Lira', pos: 'before', value: '', geckoId: 'try' },
1120011200
{ name: 'Ukrainian Hryvnia', pos: 'before', value: 'грн.', geckoId: 'uah' },
11201-
{ name: 'South African Rand', pos: 'before', value: 'ZAR', geckoId: 'zar' },
11201+
{ name: 'South African Rand', pos: 'before', value: 'R', geckoId: 'zar' },
1120211202
],
1120311203
defaultFmt: (currency: string) => [
1120411204
{ text: 'Auto', value: 'General', example: '' },
@@ -11215,7 +11215,7 @@ export default {
1121511215
},
1121611216
{
1121711217
text: 'Currency',
11218-
value: `${currency}#,##0.00`,
11218+
value: `"${currency}"#,##0.00`,
1121911219
example: `${currency}1,200.09`,
1122011220
},
1122111221
{ text: '', value: 'split', example: '' },

src/sheet-engine/core/modules/format.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,9 @@ export function isTypedCurrencyDisplayFormat(
489489
if (fa.includes(`"${c}"`)) return true;
490490
}
491491
return getSortedFiatPrefixSymbols(currencyDetail).some(
492-
(sym) => fa.startsWith(sym) && /#,##0/.test(fa),
492+
(sym) =>
493+
(fa.startsWith(sym) || fa.startsWith(quoteSsfLiteral(sym))) &&
494+
/#,##0/.test(fa),
493495
);
494496
}
495497

@@ -570,7 +572,7 @@ export function parseCurrencyPrefixedInput(
570572
const m = SSF.format(fa, finalV);
571573
return [m, ctOut, finalV];
572574
}
573-
const fa = `${sym}#,##0`;
575+
const fa = buildFiatCurrencyFormat(sym, 0, { spaced: false });
574576
const ctOut = { fa, t: 'n' };
575577
const m = SSF.format(fa, finalV);
576578
return [m, ctOut, finalV];
@@ -589,6 +591,23 @@ export function genarateOrCurrencyPrefixed(
589591
return genarate(vupdate);
590592
}
591593

594+
/** Wrap text for SSF/Excel `fa` so letters like M/H/S/d are not date/time tokens (e.g. MXN → 5XN). */
595+
export function quoteSsfLiteral(text: string): string {
596+
return `"${text.replace(/"/g, '""')}"`;
597+
}
598+
599+
/** Build a fiat currency display mask safe for SSF.format (always quotes the symbol). */
600+
export function buildFiatCurrencyFormat(
601+
symbol: string,
602+
decimals = 2,
603+
options?: { spaced?: boolean },
604+
): string {
605+
const dp = '0'.repeat(Math.max(0, decimals));
606+
const mask = decimals > 0 ? `#,##0.${dp}` : '#,##0';
607+
const sep = options?.spaced === false ? '' : ' ';
608+
return `${quoteSsfLiteral(symbol)}${sep}${mask}`;
609+
}
610+
592611
export function update(fmt: string, v: any) {
593612
return SSF.format(fmt, v);
594613
}

src/sheet-engine/core/modules/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ export {
4646
valueShowEs,
4747
isTypedCurrencyDisplayFormat,
4848
isCurrencyLikeNumberFormat,
49+
buildFiatCurrencyFormat,
50+
quoteSsfLiteral,
4951
} from './format';
5052

5153
// formula

src/sheet-engine/core/modules/toolbar.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
getSelectionCharacterOffsets,
1818
} from './cursor';
1919
import {
20+
buildFiatCurrencyFormat,
2021
datenum_local,
2122
is_date,
2223
MAX_GENERAL_AUTO_DP,
@@ -1137,7 +1138,13 @@ export function handleCurrencyFormat(ctx: Context, cellInput: HTMLDivElement) {
11371138

11381139
const currency = ctx.currency || '¥';
11391140

1140-
updateFormat(ctx, cellInput, flowdata, 'ct', `${currency} #,##0.00`);
1141+
updateFormat(
1142+
ctx,
1143+
cellInput,
1144+
flowdata,
1145+
'ct',
1146+
buildFiatCurrencyFormat(currency, 2),
1147+
);
11411148
}
11421149

11431150
export function handlePercentageFormat(

src/sheet-engine/react/components/FormatSearch/index.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
cancelNormalSelected,
44
getSheetIndex,
55
isNumericCellType,
6+
buildFiatCurrencyFormat,
67
locale,
78
update,
89
} from '@sheet-engine/core';
@@ -58,9 +59,10 @@ export const FormatSearch: React.FC<{
5859
const index = getSheetIndex(ctx, ctx.currentSheetId);
5960
if (_.isNil(index)) return;
6061
const selectedFormat = toolbarFormat[selectedFormatIndex].value;
61-
const formatString = `${selectedFormat} #,##0.${'0'.repeat(
62-
decimalPlace,
63-
)}`;
62+
const formatString =
63+
type === 'currency'
64+
? buildFiatCurrencyFormat(selectedFormat, decimalPlace)
65+
: `${selectedFormat} #,##0.${'0'.repeat(decimalPlace)}`;
6466
_.forEach(ctx.luckysheet_select_save, (selection) => {
6567
for (let r = selection.row[0]; r <= selection.row[1]; r += 1) {
6668
for (let c = selection.column[0]; c <= selection.column[1]; c += 1) {

src/sheet-engine/react/components/Toolbar/index.tsx

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,8 @@ import DuneChartsInputModal from '../DuneChartsInputModal/DuneChartsInputModal';
7878
import MoreItemsContaier from './MoreItemsContainer';
7979
import CryptoDenominationSelector from '../CryptoDenominationSelector';
8080
import { getGroupedCurrencyOptions, CRYPTO_OPTIONS } from '../../constants';
81-
import {
82-
convertCellsToCrypto,
83-
getFiatSymbol,
84-
} from '../../utils/convertCellsToCrypto';
81+
import { buildFiatCurrencyFormat } from '@sheet-engine/core';
82+
import { convertCellsToCrypto } from '../../utils/convertCellsToCrypto';
8583
import { updateCellsDecimalFormat } from '../../utils/updateCellsDecimalFormat';
8684
import { FunctionList } from './FunctionList/FunctionListButton';
8785
import SortPopoverContent from './SortPopoverContent';
@@ -382,20 +380,43 @@ export const CurrencySelector = ({
382380
decimals,
383381
});
384382
} else {
385-
setSelectedFiat(opt.value);
383+
setSelectedFiat(opt.geckoId || opt.value);
386384
setContext((ctx) => {
387385
const d = getFlowdata(ctx);
388386
if (d == null) return;
389-
const formatString = `${getFiatSymbol(
387+
const formatString = buildFiatCurrencyFormat(
390388
opt.value,
391-
)} #,##0.${'0'.repeat(decimals)}`;
389+
decimals,
390+
);
392391
updateFormat(
393392
ctx,
394393
refs.cellInput.current!,
395394
d,
396395
'ct',
397396
formatString,
398397
);
398+
if (opt.geckoId) {
399+
const selections =
400+
ctx.luckysheet_select_save;
401+
selections?.forEach((selection: any) => {
402+
for (
403+
let row = selection.row[0];
404+
row <= selection.row[1];
405+
row += 1
406+
) {
407+
for (
408+
let col = selection.column[0];
409+
col <= selection.column[1];
410+
col += 1
411+
) {
412+
const cell = d[row]?.[col];
413+
if (cell) {
414+
cell.baseCurrency = opt.geckoId;
415+
}
416+
}
417+
}
418+
});
419+
}
399420
});
400421
}
401422
setOpen(false);

src/sheet-engine/react/constants.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,14 @@ export const FIAT_ICON_MAP = {
2929

3030
// Helper to merge and group options from locale currencyDetail
3131
export function getGroupedCurrencyOptions(
32-
currencyDetail: Array<{ name: string; value: string }>,
32+
currencyDetail: Array<{ name: string; value: string; geckoId?: string }>,
3333
) {
3434
const fiatOptions = currencyDetail.map(
35-
(c: { name: string; value: string }) => {
35+
(c: { name: string; value: string; geckoId?: string }) => {
3636
return {
3737
label: c.name,
3838
value: c.value,
39+
geckoId: c.geckoId,
3940
icon: FIAT_ICON_MAP[c.value as keyof typeof FIAT_ICON_MAP] || undefined,
4041
type: 'fiat',
4142
};

0 commit comments

Comments
 (0)