Fix amount preview for scanned receipts (#227)

* no division of amount

* use gpt-4-turbo

* testing setup and naive test

* test multiple variants

* document

* correct locale names

* test large amounts

* test wth strings

* prettier
This commit is contained in:
Mert Demir
2024-09-29 07:39:01 +09:00
committed by GitHub
parent 50b3a2e431
commit 9a5674e239
6 changed files with 4123 additions and 55 deletions

View File

@@ -12,7 +12,7 @@ export async function extractExpenseInformationFromImage(imageUrl: string) {
const categories = await getCategories()
const body: ChatCompletionCreateParamsNonStreaming = {
model: 'gpt-4-vision-preview',
model: 'gpt-4-turbo',
messages: [
{
role: 'user',

66
src/lib/utils.test.ts Normal file
View File

@@ -0,0 +1,66 @@
import { formatCurrency } from './utils'
describe('formatCurrency', () => {
const currency = 'CUR'
/** For testing decimals */
const partialAmount = 1.23
/** For testing small full amounts */
const smallAmount = 1
/** For testing large full amounts */
const largeAmount = 10000
/** Non-breaking space */
const nbsp = '\xa0'
interface variation {
amount: number
locale: string
result: string
}
/**
* Variations to be tested, chosen as follows
* - `en-US` is a very common i18n fallback
* - `de-DE` exhibited faulty behavior in previous versions
*/
const variations: variation[] = [
{
amount: partialAmount,
locale: `en-US`,
result: `${currency}1.23`,
},
{
amount: smallAmount,
locale: `en-US`,
result: `${currency}1.00`,
},
{
amount: largeAmount,
locale: `en-US`,
result: `${currency}10,000.00`,
},
{
amount: partialAmount,
locale: `de-DE`,
result: `1,23${nbsp}${currency}`,
},
{
amount: smallAmount,
locale: `de-DE`,
result: `1,00${nbsp}${currency}`,
},
{
amount: largeAmount,
locale: `de-DE`,
result: `10.000,00${nbsp}${currency}`,
},
]
for (const variation of variations) {
it(`formats ${variation.amount} in ${variation.locale}`, () => {
expect(formatCurrency(currency, variation.amount, variation.locale)).toBe(
variation.result,
)
})
}
})

View File

@@ -40,7 +40,7 @@ export function formatCurrency(
// '€' will be placed in correct position
currency: 'EUR',
})
const formattedAmount = format.format(amount / 100)
const formattedAmount = format.format(amount)
return formattedAmount.replace('€', currency)
}